Description
小明有一个数列。
a[0] = a[1] = 1。
a[i] = i * a[i - 1] *a[i - 2](i≥2)。
小明想知道a[n]的因子个数。
Input
输入仅一个正整数n。
Output
输出a[n]的因子个数mod1,000,000,007的值。
Sample Input
3
Sample Output
4
DataConstraint
Hint
【数据范围】
对于30%的数据满足0≤n≤1,000。
对于100%的数据满足0≤n≤1,000,000。
分析:
(1)首先我们知道这样一个公式:
A=X^a*Y^b*Z^c (X,Y,Z为质数,其实就是把A分解质因数)
则A有 (a+1)*(b+1)*(c+1)个因数。
(2)这个数列的值有以下规律:
A[0]=1
A[1]=1
A[2]=2^1
A[3]=3^1*2^1
A[4]=4^1*3^1*2^2
A[5]=5^1*4^1*3^2*2^3
A[6]=6^1*5^1*4^2*3^3*2^5
A[7]=7^1*6^1*5^2*4^3*3^5*2^8
我们知道,设当前项数为N,fbnc[i]为斐波那契数列第i项。该A[N]有1—N所有的因数。任意因数k的指数为fbnc[n-k+1],然后用类似求素数的方法分解质因数(具体看代码),即可求解。
代码:
const
hehe=1000000007;
maxn=1000002;
var
p:array [1..maxn] of boolean;
fbnc:array [1..maxn] of longint;
c:array [1..maxn] of int64;
n,i,j,zyx,t:longint;
ans:int64;
begin
readln(n);
fbnc[1]:=1; fbnc[2]:=1;
for i:=3 to n do
fbnc[i]:=(fbnc[i-1]+fbnc[i-2]) mod hehe;
for i:=2 to n do
begin
if p[i]=false then
begin
c[i]:=fbnc[n-i+1];
j:=i+i;
while j<=n do
begin
p[j]:=true;
zyx:=j;
while zyx mod i=0 do
begin
c[i]:=(c[i]+fbnc[n-j+1]) mod hehe;
zyx:=zyx div i;
end;
j:=j+i;
end;
end;
end;
ans:=1;
for i:=2 to n do
ans:=(ans*(c[i]+1)) mod hehe;
writeln(ans);
end.