先討論一下632ios
咱們先求一遍,而後容斥spa
先求一遍的時候,咱們對於每一個數xblog
若是x的因子裏面帶平方,那麼就忽略掉,不然就在ans[x的因子個數]上加(1016/x2)的答案string
以後容斥,咱們就能夠求出這個答案it
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<sstream> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; int ans[100000005]; int last_p[100000005]; const long long n=100000000ll*100000000; long long final_ans[15]; const int modo=1000000007; int c(int n,int m) { long long i; long long p=1; for (i=1;i<=n;i++) { p*=i; } for (i=1;i<=m;i++) { p/=i; } for (i=1;i<=n-m;i++) { p/=i; } return p; } const int m=100000000; int main() { memset(ans,0,sizeof(ans)); int i,j; ans[1]=0; for (i=2;i<=m;i++) { if (ans[i]==-1) continue; if (i<=10000) { for (j=i*i;j<=m;j+=i) { ans[j]=-1; last_p[j]=i; } } } for (i=2;i<=m;i++) { if (ans[i]==0) { ans[i]=1; } else { if ((i/last_p[i])%last_p[i]==0) { ans[i]=-10000; } else { ans[i]=ans[i/last_p[i]]+1; } } } for (i=1;i<=m;i++) { if (ans[i]<0) continue; //cout<<ans[i]<<" "; final_ans[ans[i]]+=(n/i/i); } //cout<<endl; for (i=14;i>=0;i--) { int j; for (j=14;j>i;j--) { final_ans[i]-=final_ans[j]*c(j,i); } } long long p=1; for (i=0;i<=14;i++) { cout<<final_ans[i]<<endl; if (final_ans[i]!=0) { p=(long long)p*(final_ans[i]%modo)%modo; } } cout<<endl<<endl<<p<<endl; system("pause"); return 0; }
而後633是一個近似的過程io
因爲要咱們求7的,咱們就求7+的ast
顯然咱們已經不知足於1016這麼小的範圍,那隻好擴大class
把程序改爲搜索,開始爆搜stream
加個剪枝仍是挺快的搜索
質數能夠少選一些,後面的不要了
跑出最終結果須要一段時間,還要耐心等待...
反正最後跑出來結果之後咱們還能夠再稍微加一加試一試對不對,咱們精度4位就夠,題目也只要求5位
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<sstream> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; const long long m=1000000000000ll; int c(int n,int m) { long long i; long long p=1; for (i=1;i<=n;i++) { p*=i; } for (i=1;i<=m;i++) { p/=i; } for (i=1;i<=n-m;i++) { p/=i; } return p; } bool prime[4000005]; int p[500005]; int cnt=0; double ans[15]; double calc(long long x,int y,int c=0) { if (x>m) { return 0; } if (y==0) { return (long long)((double)m*m/x/x); } int i; double sum=0; for (i=c;i<cnt;i++) { double k=calc(x*p[i],y-1,i+1); if (k==0) { return sum; } sum+=k; } return sum; } int main() { memset(prime,true,sizeof(prime)); int i,j; ans[1]=0; for (i=2;i<=10000;i++) { if (prime[i]) { for (j=i*i;j<=4000000;j+=i) { prime[j]=false; } } } for (i=2;i<=4000000;i++) { if (prime[i]) { p[cnt++]=i; } } ans[10]=max(0.0,calc(1,10)); ans[9]=max(0.0,calc(1,9)); ans[8]=calc(1,8); ans[7]=calc(1,7); ans[9]-=c(10,9)*ans[10]; ans[8]-=c(10,8)*ans[10]; ans[7]-=c(10,7)*ans[10]; ans[8]-=c(9,8)*ans[9]; ans[7]-=c(9,7)*ans[9]; ans[7]-=c(8,7)*ans[8]; cout<<ans[7]<<endl; system("pause"); return 0; }