题解 奇妙的 Fibonacci
- \(fib_i \mid fib_j \iff i \mid j\),特别注意第二项不满足此性质
具体来说,所有奇数(包括1!)的约数个数会多1
然后就是复习了一下求约数个数和以及约数个数平方和的求法
都是积性函数所以还是上筛,但是注意用low和lowc以确保复杂度
Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 10000010
#define ll long long
//#define int long long
char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
}
int q, a, b, c;
int pri[N], pcnt, low[N], lowc[N];
ll s[N], g[N], lst, ans1, ans2;
bool npri[N];
const ll mod=1e9+7;
signed main()
{
q=read(); lst=read(); a=read(); b=read(); c=read();
npri[0]=npri[1]=1; s[1]=g[1]=low[1]=lowc[1]=1;
for (int i=2; i<=c; ++i) {
if (!npri[i]) pri[++pcnt]=i, s[i]=2, g[i]=(1ll*i*i+1)%mod, low[i]=i, lowc[i]=1;
for (int j=1,x; j<=pcnt&&i*pri[j]<=c; ++j) {
npri[x=i*pri[j]]=1;
if (!(i%pri[j])) {
low[x]=low[i]*pri[j];
lowc[x]=lowc[i]+1;
int d=i/low[i];
s[x]=s[d]*(s[low[i]]+1)%mod;
g[x]=g[d]*(g[low[i]] + low[i]*pri[j]%mod*low[i]%mod*pri[j]%mod)%mod;
continue;
}
else s[x]=s[i]*s[pri[j]]%mod, g[x]=g[i]*g[pri[j]]%mod, low[x]=pri[j], lowc[x]=1;
}
}
// cout<<"s: "; for (int i=1; i<=10; ++i) cout<<s[i]<<' '; cout<<endl;
// cout<<"g: "; for (int i=1; i<=10; ++i) cout<<g[i]<<' '; cout<<endl;
for (int i=1; i<=q; ++i) {
// cout<<"lst: "<<lst<<endl;
ans1=(ans1+s[lst]+(lst&1))%mod;
ans2=(ans2+g[lst]+(lst&1)*4)%mod;
lst=(lst*a+b)%c+1;
}
printf("%lld\n%lld\n", ans1, ans2);
return 0;
}