Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int M=(1<<9)-1;
- long long n;
- int outp=0;
- int arr[50];
- long long LIMIT[50];
- bool can[M+42][M+42];
- void rec(int MX,int pos,long long sum,long long prod)
- {
- if(pos>=4)
- {
- long long sum_low=arr[3]+arr[3]+sum+n-pos+1;
- long long sum_new=sum+n-pos+1;
- //a1*a2*prod<=sum_new+a1+a2
- //a2=MX
- long long a2=arr[3];
- long long a1_max=(sum_new+a2)/(prod*a2-1);
- if(a1_max<arr[3])return;
- long long sum_high=a1_max+a2+sum_new;
- if(sum_high/prod*prod<sum_low)return;
- MX=min(1LL*MX,sum_high/prod/arr[3]/arr[3]);
- }
- //solve P*a1*a2=S+a1+a2
- if(1)
- {
- long long s_new=sum+n-pos+1;
- //prod*a1*a2=s_new+a1+a2
- double O1=sqrt(s_new/prod)-arr[3];
- int type=1;
- if(arr[3]>1)
- {
- long long sum_low=arr[3]+arr[3]+sum+n-pos+1;
- long long sum_new=sum+n-pos+1;
- //a1*a2*prod<=sum_new+a1+a2
- //a2=MX
- long long a2=arr[3];
- long long a1_max=(sum_new+a2)/(prod*a2-1);
- long long sum_high=a1_max+a2+sum_new;
- double O2=sum_high/prod-sum_low/prod;
- if(O1>O2)type=2;
- }
- if(type==1)//~O(sqrt(n/prod))
- {
- long long up,down;
- for(int a2=max(2,arr[3]);true;a2++)
- {
- //break;
- up=s_new+a2;
- down=prod*a2-1;
- if(up/down<a2)break;
- if(up%down==0)outp++;
- }
- }
- else//O(n/prod^2/arr[3])
- {
- long long sum_low=arr[3]+arr[3]+sum+n-pos+1;
- long long sum_new=sum+n-pos+1;
- //a1*a2*prod<=sum_new+a1+a2
- //a2=MX
- long long a2=arr[3];
- long long a1_max=(sum_new+a2)/(prod*a2-1);
- long long sum_high=a1_max+a2+sum_new;
- long long S,P,D,k;
- for(long long sum_final=sum_high/prod*prod;sum_final>=sum_low;sum_final-=prod)
- {
- //prod*x*y=sum_new+x+y=sum_final
- S=sum_final-sum_new;//x+y=S
- P=sum_final/prod;//x*y=P
- if(can[P&M][S&M]==0)continue;
- D=S*S-4*P;
- if(D<0)continue;
- k=sqrt(D);
- if(k*k!=D)continue;
- long long y=(S-k)>>1;
- if(y>=arr[3])outp++;
- }
- }
- }
- if(pos==n+1)return;
- MX=min(MX*1LL,2*n/prod/arr[3]/arr[3]);
- MX=min(MX*1LL,LIMIT[pos]);
- for(int i=2;i<=MX;i++)
- {
- arr[pos]=i;
- rec(i,pos+1,sum+i,prod*i);
- }
- }
- int main()
- {
- for(int x=0;x<=M;x++)
- for(int y=x;y<=M;y++)
- can[(x*y)&M][(x+y)&M]=1;
- arr[3]=1;
- scanf("%lld",&n);
- for(int i=2;i<50;i++)
- LIMIT[i]=pow(n+1,1.0/i)+1;
- rec(LIMIT[3],3,0,1);
- printf("%i\n",outp);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement