Advertisement
a53

sum_prod

a53
Dec 6th, 2021
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.04 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int M=(1<<9)-1;
  5.  
  6. long long n;
  7.  
  8. int outp=0;
  9.  
  10. int arr[50];
  11.  
  12. long long LIMIT[50];
  13.  
  14. bool can[M+42][M+42];
  15.  
  16. void rec(int MX,int pos,long long sum,long long prod)
  17. {
  18. if(pos>=4)
  19. {
  20. long long sum_low=arr[3]+arr[3]+sum+n-pos+1;
  21.  
  22. long long sum_new=sum+n-pos+1;
  23. //a1*a2*prod<=sum_new+a1+a2
  24. //a2=MX
  25.  
  26. long long a2=arr[3];
  27.  
  28. long long a1_max=(sum_new+a2)/(prod*a2-1);
  29.  
  30. if(a1_max<arr[3])return;
  31.  
  32. long long sum_high=a1_max+a2+sum_new;
  33.  
  34. if(sum_high/prod*prod<sum_low)return;
  35.  
  36. MX=min(1LL*MX,sum_high/prod/arr[3]/arr[3]);
  37. }
  38.  
  39. //solve P*a1*a2=S+a1+a2
  40. if(1)
  41. {
  42. long long s_new=sum+n-pos+1;
  43.  
  44. //prod*a1*a2=s_new+a1+a2
  45. double O1=sqrt(s_new/prod)-arr[3];
  46.  
  47. int type=1;
  48.  
  49. if(arr[3]>1)
  50. {
  51. long long sum_low=arr[3]+arr[3]+sum+n-pos+1;
  52.  
  53. long long sum_new=sum+n-pos+1;
  54. //a1*a2*prod<=sum_new+a1+a2
  55. //a2=MX
  56.  
  57. long long a2=arr[3];
  58.  
  59. long long a1_max=(sum_new+a2)/(prod*a2-1);
  60.  
  61. long long sum_high=a1_max+a2+sum_new;
  62.  
  63. double O2=sum_high/prod-sum_low/prod;
  64.  
  65. if(O1>O2)type=2;
  66. }
  67.  
  68. if(type==1)//~O(sqrt(n/prod))
  69. {
  70. long long up,down;
  71.  
  72. for(int a2=max(2,arr[3]);true;a2++)
  73. {
  74. //break;
  75. up=s_new+a2;
  76. down=prod*a2-1;
  77.  
  78. if(up/down<a2)break;
  79.  
  80. if(up%down==0)outp++;
  81. }
  82.  
  83. }
  84. else//O(n/prod^2/arr[3])
  85. {
  86. long long sum_low=arr[3]+arr[3]+sum+n-pos+1;
  87.  
  88. long long sum_new=sum+n-pos+1;
  89. //a1*a2*prod<=sum_new+a1+a2
  90. //a2=MX
  91.  
  92. long long a2=arr[3];
  93.  
  94. long long a1_max=(sum_new+a2)/(prod*a2-1);
  95.  
  96. long long sum_high=a1_max+a2+sum_new;
  97.  
  98. long long S,P,D,k;
  99.  
  100. for(long long sum_final=sum_high/prod*prod;sum_final>=sum_low;sum_final-=prod)
  101. {
  102. //prod*x*y=sum_new+x+y=sum_final
  103.  
  104. S=sum_final-sum_new;//x+y=S
  105. P=sum_final/prod;//x*y=P
  106.  
  107. if(can[P&M][S&M]==0)continue;
  108.  
  109. D=S*S-4*P;
  110.  
  111. if(D<0)continue;
  112.  
  113. k=sqrt(D);
  114.  
  115. if(k*k!=D)continue;
  116.  
  117. long long y=(S-k)>>1;
  118.  
  119. if(y>=arr[3])outp++;
  120. }
  121. }
  122. }
  123.  
  124. if(pos==n+1)return;
  125.  
  126. MX=min(MX*1LL,2*n/prod/arr[3]/arr[3]);
  127. MX=min(MX*1LL,LIMIT[pos]);
  128.  
  129. for(int i=2;i<=MX;i++)
  130. {
  131. arr[pos]=i;
  132.  
  133. rec(i,pos+1,sum+i,prod*i);
  134. }
  135. }
  136.  
  137. int main()
  138. {
  139. for(int x=0;x<=M;x++)
  140. for(int y=x;y<=M;y++)
  141. can[(x*y)&M][(x+y)&M]=1;
  142.  
  143. arr[3]=1;
  144.  
  145. scanf("%lld",&n);
  146.  
  147. for(int i=2;i<50;i++)
  148. LIMIT[i]=pow(n+1,1.0/i)+1;
  149.  
  150. rec(LIMIT[3],3,0,1);
  151.  
  152. printf("%i\n",outp);
  153.  
  154. return 0;
  155. }
  156.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement