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);
}