题解 奇妙的 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;
}
posted @ 2021-10-11 06:08  Administrator-09  阅读(0)  评论(0编辑  收藏  举报