nsyntgod

CHEFNUM

Mar 20th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define rep(i,n) for(int i=0, _n=(n); i<_n; i++)
  5. const int M=16, mod=1e9+7;
  6.  
  7. int goal, all, p10[M], a[1<<M][10], memo[20][1<<M];
  8. inline int f(int len, int flag) {
  9.     if(all) return p10[len];
  10.     if(!len) return (flag>>goal&1); // modify value
  11.     if(memo[len][flag]+1) return memo[len][flag];
  12.    
  13.     int ans=0;
  14.     rep(i,10) ans += f(len-1, a[flag][i]); // modify 'sum'
  15.     return memo[len][flag] = ans;
  16. }
  17. inline int tot(int n, int x) {
  18.     if(!n) return 0;
  19.    
  20.     all = 0;
  21.     goal = x;
  22.     memset(memo, -1, sizeof memo);
  23.  
  24.     int d[20], len=0;
  25.     while(n) d[len++] = n%10, n/=10;
  26.    
  27.     int ans=0, flag=0;
  28.     for(int i=len; i--; ) {
  29.         if(flag>>goal&1) all=1;
  30.         rep(j,d[i]) ans += f(i, a[flag][j]);
  31.         flag = a[flag][d[i]];
  32.     }
  33.     return x*ans%mod;
  34. }
  35.  
  36. #undef int
  37. int main() {
  38. #define int long long
  39.    
  40.     rep(flag,1<<M)rep(x,10) {
  41.         int flag2 = (1<<x);
  42.         rep(i,M) if(flag>>i&1) flag2 |= (1<<(i^x));
  43.         a[flag][x] = flag2;
  44.     }
  45.     rep(i,M) p10[i]=(i?p10[i-1]*10:1);
  46.  
  47.     int q; cin >> q;
  48.     while(q--) {
  49.         int l, r; cin >> l >> r;
  50.         int ans=0;
  51.         rep(i,M) ans += tot(r+1,i)-tot(l,i)+mod;
  52.         cout << ans%mod << '\n';
  53.     }
  54.  
  55.     return 0;
  56. }
Add Comment
Please, Sign In to add comment