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=; bool vis[N];
int p[]; int t[N],c[N];
int s[N],e[N]; int main()
{
int cnt=;
t[]=;
s[]=;
for(int i=;i<N;++i)
{
if(!vis[i])
{
p[++cnt]=i;
t[i]=((LL)i*i+)%mod;
c[i]=;
s[i]=;
e[i]=;
}
for(int j=;j<=cnt;++j)
{
if(i*p[j]>=N) break;
vis[i*p[j]]=true;
if(i%p[j]==)
{
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]+)*(e[i]+);
e[i*p[j]]=e[i]+;
break;
}
t[i*p[j]]=((LL)t[i]*((LL)p[j]*p[j]+%mod))%mod;
c[i*p[j]]=t[i];
s[i*p[j]]=s[i]<<;
e[i*p[j]]=;
}
}
int ans1=,ans2=;
int Q;
int Qi,A,B,C;
scanf("%d",&Q);
scanf("%d%d%d%d",&Qi,&A,&B,&C);
while(Q--)
{
ans1+= Qi&;
ans1+=s[Qi];
ans1-= ans1>=mod ? mod : ;
ans2+=(Qi&)<<;
ans2+=t[Qi];
ans2-= ans2>=mod ? mod : ;
Qi=((LL)Qi*A+B)%+C+;
}
cout<<ans1<<'\n'<<ans2;
}