bzoj2813: 奇妙的Fibonacci
http://www.lydsy.com/JudgeOnline/problem.php?id=2813
若j能整除i,则f[j]能整除f[i]
题目就变成了求约数个数和、约数的平方和
http://www.cnblogs.com/TheRoadToTheGold/p/8228969.html
因为f[2]=1,所以奇数还要加上2的贡献
#include<cstdio> #include<iostream> using namespace std; #define N 10000001 typedef long long LL; const int mod=1000000007; bool vis[N]; int p[664581]; int t[N],c[N]; int s[N],e[N]; int main() { int cnt=0; t[1]=1; s[1]=1; for(int i=2;i<N;++i) { if(!vis[i]) { p[++cnt]=i; t[i]=((LL)i*i+1)%mod; c[i]=1; s[i]=2; e[i]=1; } for(int j=1;j<=cnt;++j) { if(i*p[j]>=N) break; vis[i*p[j]]=true; if(i%p[j]==0) { t[i*p[j]]=((LL)t[i]*p[j]%mod*p[j]%mod+c[i])%mod; c[i*p[j]]=c[i]; s[i*p[j]]=s[i]/(e[i]+1)*(e[i]+2); e[i*p[j]]=e[i]+1; break; } t[i*p[j]]=((LL)t[i]*((LL)p[j]*p[j]+1%mod))%mod; c[i*p[j]]=t[i]; s[i*p[j]]=s[i]<<1; e[i*p[j]]=1; } } int ans1=0,ans2=0; int Q; int Qi,A,B,C; scanf("%d",&Q); scanf("%d%d%d%d",&Qi,&A,&B,&C); while(Q--) { ans1+= Qi&1; ans1+=s[Qi]; ans1-= ans1>=mod ? mod : 0; ans2+=(Qi&1)<<2; ans2+=t[Qi]; ans2-= ans2>=mod ? mod : 0; Qi=((LL)Qi*A+B)%+C+1; } cout<<ans1<<'\n'<<ans2; }