Guest User

Untitled

a guest
Jun 24th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <vector>
  5.  
  6. using namespace std;
  7. #define MAXDIG 20
  8. #define MAXPOT 12
  9. #define PRAZNO 0
  10. #define NEPARNO 1
  11. #define PARNO 2
  12. #define MAXMASK 60000
  13.  
  14. int dig[MAXDIG];
  15. int pot[MAXPOT];
  16.  
  17. long long dp[MAXDIG][MAXMASK][2][2];
  18.  
  19. long long rec(int x, int mask, int dira, int poz){
  20.   int currmask = mask;
  21.   if(MAXDIG == x){
  22.     for(int i = 0; i < 10; ++i){
  23.       int d = currmask % 3;
  24.       currmask /= 3;
  25.       if(i % 2 == 0 && PARNO == d)
  26.         return 0;
  27.       if(i % 2 == 1 && NEPARNO == d)
  28.         return 0;
  29.     }
  30.     return 1;
  31.   }
  32.   long long &ref = dp[x][mask][dira][poz];
  33.   if(-1 != ref)
  34.     return ref;
  35.   ref = 0;
  36.   for(int i = 0; i < 10; ++i){
  37.     if(dira && i > dig[x])
  38.       break;
  39.     int d = currmask % 3;
  40.     currmask /= 3;
  41.     int newmask;
  42.     if(PRAZNO == d){
  43.       newmask = mask + (NEPARNO - PRAZNO) * pot[i];
  44.     }else if(PARNO == d){
  45.       newmask = mask + (NEPARNO - PARNO) * pot[i];
  46.     }else{
  47.       newmask = mask + (PARNO - NEPARNO) * pot[i];
  48.     }
  49.  
  50.     if(!poz && i == 0)
  51.       newmask = mask;
  52.     ref += rec(x+1, newmask, dira && (dig[x] == i), poz || (i > 0));
  53.   }
  54.   return ref;
  55. }
  56.  
  57. long long count(long long x){
  58.   memset(dig, 0, sizeof dig);
  59.   for(int i = MAXDIG-1; i >= 0; --i){
  60.     dig[i] = x % 10;
  61.     x /= 10;
  62.   }
  63.   memset(dp, -1, sizeof dp);
  64.   return rec(0, 0, 1, 0);
  65. }
  66.  
  67. void run(){
  68.   long long a, b;
  69.   scanf("%lld%lld", &a, &b);
  70.   long long ret = count(b) - count(a-1);
  71.   printf("%lld\n", ret);  
  72. }
  73.  
  74. int main(){
  75.   pot[0] = 1;
  76.   for(int i = 1; i < MAXPOT; ++i)
  77.     pot[i] = 3 * pot[i-1];
  78.  
  79.   int T;
  80.   scanf("%d", &T);
  81.   for(int i = 0; i < T; ++i)
  82.     run();
  83.   return 0;
  84. }
Add Comment
Please, Sign In to add comment