Dang_Quan_10_Tin

THẦN SỐ HỌC

Aug 3rd, 2022
682
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #define task "NROLOGY"
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5. using ll = long long;
  6.  
  7. constexpr int N = 5e2 + 5;
  8. constexpr ll mod = 1e9 + 7;
  9. string b, s;
  10.  
  11. ll dp[N][N][2][3], d[N][N];
  12.  
  13. int n, m;
  14.  
  15. void Read()
  16. {
  17.     cin >> s >> b;
  18.  
  19.     reverse(b.begin(), b.end());
  20.  
  21.     while (b.size() < s.size())
  22.         b.push_back('0');
  23.     reverse(b.begin(), b.end());
  24.  
  25.     n = b.size();
  26.     m = s.size();
  27.     b = " " + b + " ";
  28.     s = " " + s + " ";
  29. }
  30.  
  31. ll toll(const string s)
  32. {
  33.     ll ans(0);
  34.  
  35.     for (auto i : s)
  36.         ans = ans * 10 + i - '0';
  37.  
  38.     return ans;
  39. }
  40.  
  41. ll Pow(ll a, ll b) {
  42.     ll ans(1);
  43.     for(; b; b >>= 1) {
  44.         if(b & 1) ans = ans * a % mod;
  45.         a = a * a % mod;
  46.     }
  47.     return ans;
  48. }
  49.  
  50. ll f(int l, int r, bool okl, int okr)
  51. {
  52.  
  53.     ll &ans = dp[l][r][okl][okr];
  54.  
  55.     if (ans != -1)
  56.         return ans;
  57.  
  58.     int pos = n - (l + (n + 1 - r));
  59.  
  60.     if (pos == 0)
  61.         return ans = (okl || okr != 2);
  62.  
  63.     ans = 0;
  64.  
  65.     if (okl || s[pos] <= b[l + 1])
  66.         (ans += f(l + 1, r, okl || s[pos] < b[l + 1], okr)) %= mod;
  67.  
  68.     {
  69.         int t;
  70.  
  71.         if (s[pos] > b[r - 1])
  72.             t = 2;
  73.         else if (s[pos] < b[r - 1])
  74.             t = 1;
  75.         else
  76.             t = okr;
  77.  
  78.         (ans += f(l, r - 1, okl, t)) %= mod;
  79.     }
  80.  
  81.     return ans;
  82. }
  83.  
  84. void Solve()
  85. {
  86.  
  87.     if (s.size() < b.size())
  88.         cout << Pow(2, m - 1);
  89.     else
  90.     {
  91.         memset(dp, -1, sizeof dp);
  92.         cout << f(0, n + 1, 0, 0) * 500000004 % mod; // 500000004 = 2^(mod - 2)
  93.     }
  94. }
  95.  
  96. int32_t main()
  97. {
  98.     ios::sync_with_stdio(0);
  99.     cin.tie(0);
  100.     cout.tie(0);
  101.     if (fopen(task ".INP", "r"))
  102.     {
  103.         freopen(task ".INP", "r", stdin);
  104.         freopen(task ".OUT", "w", stdout);
  105.     }
  106.     Read();
  107.     Solve();
  108. }
Advertisement
Add Comment
Please, Sign In to add comment