Advertisement
welleyth

C. inequalities

May 6th, 2023
729
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. //#define int long long
  6. #define mp make_pair
  7. #define pb push_back
  8.  
  9. constexpr int N = (int)2e5 + 111;
  10. constexpr int md = (int)1050000011;
  11. constexpr int inv6 = 175000002;
  12.  
  13. //#pragma GCC optimize("O3")
  14. //#pragma GCC optimize("unroll-loops")
  15. //#pragma GCC target("avx2")
  16.  
  17. map<int,int> s[66];
  18. long long n,m;
  19. vector<int> cur;
  20.  
  21. int bpow(int a,int b){
  22.     if(b == 0) return 1;
  23.     if(b % 2 == 0){
  24.         int t = bpow(a,b>>1);
  25.         return 1ll * t * t % md;
  26.     }
  27.     return (1ll * a * bpow(a,b-1)) % md;
  28. }
  29.  
  30. __int128 bpow2(int a,int b){
  31.     if(b == 0) return 1;
  32.     if(b % 2 == 0){
  33.         __int128 t = bpow2(a,b>>1);
  34.         return t * t;
  35.     }
  36.     return (a * bpow2(a,b-1));
  37. }
  38.  
  39. void add(int& a,int b){
  40.     a = (a + b >= md ? a + b - md : a + b);
  41. }
  42.  
  43. int sum(long long l,long long r){
  44.     l--;
  45.     int a = 1ll * r * (r + 1) % md * (2 * r + 1) % md * inv6 % md;
  46.     int b = 1ll * l * (l + 1) % md * (2 * l + 1) % md * inv6 % md;
  47.     a = (a - b < 0 ? a - b + md : a - b);
  48.     return a;
  49. }
  50.  
  51. int f3(int x){
  52.     long long l = sqrtl(1ll * x*x*x);
  53.     if(l * l < 1ll * x * x * x)
  54.         l++;
  55.     long long r = sqrtl(m);
  56. //        cerr << i << " " << x << ": " << ((r - l + 1) * ((m+1) % md) % md - sum(l,r) + md) % md << "\n";
  57.     return max(0ll,1ll*(r - l + 1) * ((m+1) % md) % md - sum(l,r) + md) % md;
  58. }
  59.  
  60. int dp[8][(int)1e6+10];
  61. int suff[8][(int)1e6+10];
  62. int dp2[11][(int)1e3+10];
  63. int suff2[11][(int)1e3+10];
  64.  
  65. int get(int i,int x){
  66.     if(i == 1){
  67.         return 1;
  68.     }
  69.     if(x != 0 && i == 2){
  70.         return max(0ll,m-1ll*x*x+1) % md;
  71.     }
  72.     if(x != 0 && i == 3){
  73.         return f3(x);
  74.     }
  75.     if(x != 0 && i == 4){
  76.         return dp[4][x];
  77.     }
  78.     if(x != 0 && i == 5){
  79.         return dp[5][x];
  80.     }
  81.     if(x != 0 && i == 6)
  82.         return dp[6][x];
  83.     if(x != 0 && i == 7)
  84.         return dp[7][x];
  85.     if(x != 0 && i <= 10)
  86.         return dp2[i][x];
  87.     if(s[i].count(x))
  88.         return s[i][x];
  89.     int ans = 0;
  90.     long long t = pow(m,1.0/(i-1));
  91.     for(int j = 1; j <= min(m,t); j++){
  92.         __int128 c = 1, c2 = x;
  93.         for(int p = 0; p < i-1; p++){
  94.             c *= j;
  95.             c2 *= x;
  96.         }
  97.         if(c < c2 || c > m)
  98.             continue;
  99. //        cur.pb(j);
  100.         add(ans,get(i-1,j));
  101. //        cur.pop_back();
  102.     }
  103.     return s[i][x] = ans;
  104. }
  105.  
  106. void solve(){
  107.     cin >> n >> m;
  108.  
  109.     n = min(n,__lg(m));
  110.  
  111.     if(n == 1){
  112.         cout << m%md << "\n";
  113.         return;
  114.     }
  115.  
  116.     for(int i = cbrtl(m); i > 0; i--){
  117.         suff[3][i] = suff[3][i+1];
  118.         add(suff[3][i],f3(i));
  119.     }
  120. //    cerr << "3\n";
  121. //    cerr << "m^1/4: " << pow(m,1.0/4) << "\n";
  122.  
  123.     __int128 r;
  124.     r = pow(m,1.0/3);
  125.     for(__int128 i = pow(m,1.0/4); i > 0; i--){
  126.         while(r * r * r >= i * i * i * i)
  127.             r--;
  128.         dp[4][i] = suff[3][r+1];
  129.         suff[4][i] = suff[4][i+1];
  130.         add(suff[4][i],dp[4][i]);
  131.     }
  132. //    cerr << "4\n";
  133.  
  134.     r = pow(m,1.0/4);
  135.     for(__int128 i = pow(m,1.0/5); i > 0; i--){
  136.         while(r * r * r * r >= i * i * i * i * i)
  137.             r--;
  138.         dp[5][i] = suff[4][r+1];
  139.         suff[5][i] = suff[5][i+1];
  140.         add(suff[5][i],dp[5][i]);
  141.     }
  142. //    cerr << "5\n";
  143.  
  144.     r = pow(m,1.0/5);
  145.     for(__int128 i = pow(m,1.0/6); i > 0; i--){
  146.         while(r * r * r * r * r >= i * i * i * i * i * i)
  147.             r--;
  148.         dp[6][i] = suff[5][r+1];
  149.         suff[6][i] = suff[6][i+1];
  150.         add(suff[6][i],dp[6][i]);
  151.     }
  152. //    cerr << "6\n";
  153.  
  154.     r = pow(m,1.0/6);
  155.     for(__int128 i = pow(m,1.0/7); i > 0; i--){
  156.         while(r * r * r * r * r * r >= i * i * i * i * i * i * i)
  157.             r--;
  158.         dp[7][i] = suff[6][r+1];
  159.         suff[7][i] = suff[7][i+1];
  160.         add(suff[7][i],dp[7][i]);
  161.     }
  162.  
  163.     r = pow(m,1.0/7);
  164.     for(__int128 i = pow(m,1.0/8); i > 0; i--){
  165.         while(r * r * r * r * r * r * r >= i * i * i * i * i * i * i * i)
  166.             r--;
  167.         dp2[8][i] = suff[7][r+1];
  168.         suff2[8][i] = suff2[8][i+1];
  169.         add(suff2[8][i],dp2[8][i]);
  170.     }
  171.  
  172.     r = pow(m,1.0/8);
  173.     for(__int128 i = pow(m,1.0/9); i > 0; i--){
  174.         while(r * r * r * r * r * r * r * r >= i * i * i * i * i * i * i * i * i)
  175.             r--;
  176.         dp2[9][i] = suff2[8][r+1];
  177.         suff2[9][i] = suff2[9][i+1];
  178.         add(suff2[9][i],dp2[9][i]);
  179.     }
  180.  
  181.     r = pow(m,1.0/9);
  182.     for(__int128 i = pow(m,1.0/10); i > 0; i--){
  183.         while(r * r * r * r * r * r * r * r * r >= i * i * i * i * i * i * i * i * i * i)
  184.             r--;
  185.         dp2[10][i] = suff2[9][r+1];
  186.         suff2[10][i] = suff2[10][i+1];
  187.         add(suff2[10][i],dp2[10][i]);
  188.     }
  189.  
  190.     cout << get(n+1,1) << "\n";
  191.  
  192.     return;
  193. }
  194.  
  195. signed main(){
  196.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  197. //  freopen("output.txt","w",stdout);
  198.     int tests = 1;
  199. //    cin >> tests;
  200.     for(int test = 1; test <= tests; test++){
  201.         solve();
  202.     }
  203.     return 0;
  204. }
  205. /**
  206. a_i^i <= a_{i-1} ^ {i-1}
  207. a_i^i * a_{i-1} <= a_{i-1}^i
  208.  
  209. i * log(a_i) <= (i-1) * log(a_{i-1})
  210.  
  211. i/(i-1) * log(a_i) <= log(a_{i-1})
  212.  
  213. a_{i-1} >= exp(i/(i-1)*log(a_i))
  214.  
  215. 2 1
  216. 1 1
  217.  
  218. 9 1
  219. 9 2
  220. 9 3
  221.  
  222.  
  223. **/
  224.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement