Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. int t;
  8. unsigned long long int A,B,dp[20][49][5][7][8][9];
  9. bool visit[20][49][5][7][8][9];
  10. int num[49] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 18, 20, 21, 24, 28, 30, 35, 36, 40, 42, 45, 56, 60, 63, 70, 72, 84, 90, 105, 120, 126, 140, 168, 180, 210, 252, 280, 315, 360, 420, 504, 630, 840, 1260, 2520};
  11. int gcd(int a,int b){
  12.         if(a == 0) return b;
  13.         return gcd(b%a,a);
  14. }
  15.  
  16. unsigned long long int cal(unsigned long long int prefix,int N,int lcm,int five,int seven,int eight,int nine){
  17.         unsigned long long int mini = prefix,maxi = prefix,tmp = 0;
  18.         for(int i=0;i<N;++i){
  19.                 mini = mini*10llu;
  20.                 maxi = maxi*10llu+9llu;
  21.         }
  22.         if(mini > B || maxi < A) return 0;
  23.         bool memo = (A <= mini && maxi <= B);
  24.         int x;
  25.         if(memo && visit[N][lcm][five][seven][eight][nine] == 1) return dp[N][lcm][five][seven][eight][nine];
  26.         if(N == 0){
  27.                 if(prefix == 0) tmp = 1;
  28.                 else{
  29.                         if(
  30.                                 (num[lcm]/2*2 != num[lcm] ||  eight/2*2 == eight) &&
  31.                                 (num[lcm]/3*3 != num[lcm] ||   nine/3*3 == nine) &&
  32.                                 (num[lcm]/4*4 != num[lcm] ||  eight/4*4 == eight) &&
  33.                                 (num[lcm]/5*5 != num[lcm] ||   five/5*5 == five) &&
  34.                                 (num[lcm]/6*6 != num[lcm] || (eight/2*2 == eight && nine/3*3 == nine)) &&
  35.                                 (num[lcm]/7*7 != num[lcm] ||  seven/7*7 == seven) &&
  36.                                 (num[lcm]/8*8 != num[lcm] ||  eight/8*8 == eight) &&
  37.                                 (num[lcm]/9*9 != num[lcm] ||   nine/9*9 == nine)) tmp = 1;
  38.                 }
  39.         }
  40.         else{
  41.                 mini = prefix*10llu;
  42.                 for(int i=0;i<10;++i){
  43.                         maxi = mini + (long long int)(i);
  44.                 if(i == 0) x = lcm;
  45.                                 else if(lcm == 0 && i > 0) x = lower_bound(num,num+49,i)-num;
  46.                 else x = lower_bound(num,num+49,num[lcm]*i/gcd(min(num[lcm],i),max(num[lcm],i)))-num;
  47.                         tmp += cal(maxi,N-1,x,(10*five+i)-(10*five+i)/5*5,(10*seven+i)-(10*seven+i)/7*7,(10*eight+i)-(10*eight+i)/8*8,(10*nine+i)-(10*nine+i)/9*9);
  48.                 }
  49.         }
  50.         if(memo){
  51.                     dp[N][lcm][five][seven][eight][nine] = tmp;
  52.                     visit[N][lcm][five][seven][eight][nine] = 1;
  53.                 }
  54.         return tmp;
  55. }
  56.  
  57. int main(){
  58.         scanf("%d",&t);
  59.         for(int a=0;a<t;++a){
  60.               //  memset(visit,0,sizeof(visit));
  61.                 scanf("%I64u%I64u",&A,&B);
  62.                 printf("%I64u\n",cal(0,19,0,0,0,0,0));
  63.            //     scanf("%llu%llu",&A,&B);
  64.             //    printf("%llu\n",cal(0,19,0,0,0,0,0));
  65.         }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement