【JZOJ B组】斐波那契

版权声明:转载者乖乖♂站好 https://blog.csdn.net/Eric1561759334/article/details/83447959

Description

小明有一个数列。

a[0] = a[1] = 1。

a[i] = i * a[i - 1] * a[i - 2](i≥2)。

小明想知道a[n]的因子个数。

Input

输入仅一个正整数n。

Output

输出a[n]的因子个数mod 1,000,000,007的值。

Sample Input

3

Sample Output

4

Hint

【数据范围】

对于30%的数据满足0≤n≤1,000。

对于100%的数据满足0≤n≤1,000,000。

思路

标题给了很大的提示

可以发现,a[n]=2f[n] * 3f[n-1] * 4f[n-2]

所以,把1–n分解质因数,再统计次数即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod=1e9+7,maxn=1e6+77;
int n,f[maxn],a[maxn];
bool b[maxn];
long long ans=1;
int main()
{
	scanf("%d",&n);
	f[1]=f[2]=1;
	for(int i=3; i<=n; i++) f[i]=(f[i-1]+f[i-2])%mod;
	for(int i=2; i<=n; i++)
	{
		if(b[i]) continue; b[i]=1;
		a[i]=f[n-i+1];
		int j=i*2;
		while(j<=n)
		{
			b[j]=1;
			int x=j;
			while(x%i==0)
			{
				x/=i; a[i]=(a[i]+f[n-j+1])%mod;
			}
			j+=i;
		}
	}
	for(int i=2; i<=n; i++) ans=(1ll*ans*(a[i]+1))%mod;
	printf("%lld",ans);
}

猜你喜欢

转载自blog.csdn.net/Eric1561759334/article/details/83447959
今日推荐