Advertisement
Guest User

369

a guest
Jan 18th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. /* #################### */
  2. /* # I_LOVE_THUY_LINH # */
  3. /* #################### */
  4. #include <bits/stdc++.h>
  5. #define ll long long
  6. #define db double
  7. #define ld long double
  8. #define ii pair<int,int>
  9. #define pb push_back
  10. #define vi vector<int>
  11. #define vii vector<ii>
  12. #define matrix vector<vector<ll>>
  13. #define fir first
  14. #define sec second
  15. #define all(s) s.begin(),s.end()
  16. #define rall(s) s.rbegin(),s.rend()
  17. #define uni(a) (a).erase(unique(all(a)),(a).end())
  18. #define sz(a) int((a).size())
  19. #define ms(s,val) memset(s,val,sizeof(s))
  20. #define bitcount(n) __builtin_popcountll(n)
  21. #define getbit(s,k) ((s >> k)&1)
  22. #define turnbit(s,k) (s | (1<<k))
  23. #define offbit(s,k) (s & ~(1<<k))
  24. #define flipbit(s,k) (s ^ (1<<k))
  25. #define prec(n) fixed<<setprecision(n)
  26. #define sqr(x) (ll)(x)*(ll)(x)
  27. #define lcm(a,b) ((ll)a/__gcd((ll)a,(ll)b)*(ll)(b))
  28. #define gcd(a,b) __gcd(a,b)
  29. using namespace std;
  30. const int INF = int(1e9);
  31. const ll Mod = (ll)(1e9) + 7;
  32. const int maxlen = 17;
  33. int t;
  34. string s1, s2;
  35. ll memo[50][2][2*maxlen + 1][2*maxlen + 1][2][2];
  36.  
  37. ll dp(int pos,bool nonzero,int diff1,int diff2,bool low,bool high){
  38. if (pos == s2.size()){
  39. if (nonzero && (diff1 == 0) && (diff2 == 0)) return 1;
  40. else return 0;
  41. }
  42.  
  43. ll &ans = memo[pos][nonzero][diff1 + maxlen][diff2 + maxlen][low][high];
  44. if (ans != -1) return ans;
  45.  
  46. ans = 0;
  47. for (int digit = 0; digit < 10; digit++){
  48. if (((digit >= s1[pos] - '0') || high) && ((digit <= s2[pos] - '0') || low)){
  49. bool newnonzero = nonzero;
  50. int newdiff1 = diff1;
  51. int newdiff2 = diff2;
  52. if (digit == 3){
  53. newnonzero = 1;
  54. newdiff1 --;
  55. newdiff2--;
  56. if (!(newdiff1 >= -17 && newdiff2 >= -17)) continue;
  57. }
  58. else if (digit == 6){
  59. newdiff1++;
  60. if (newdiff1 > 17) continue;
  61. }
  62. else if (digit == 9){
  63. newdiff2++;
  64. if (newdiff2 > 17) continue;
  65. }
  66. ans = (ans + dp(pos + 1,newnonzero,newdiff1,newdiff2,(digit < s2[pos] - '0') || low,(digit > s1[pos] - '0') || high) ) % Mod;
  67. }
  68. }
  69. return ans;
  70. }
  71.  
  72.  
  73. int main(){
  74. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  75. cin >> t;
  76. while (t--){
  77. cin >> s1 >> s2;
  78. while (s1.size() < s2.size()) s1 = "0" + s1;
  79. memset(memo,-1,sizeof(memo));
  80. cout << dp(0,0,0,0,0,0) << '\n';
  81. }
  82. return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement