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的值。
题解
因为F[2]的因子个数等于2的一次方,
F[3]的因子个数等于3的一次方*2的一次方,
F[4]的因子个数等于4的一次方*3的一次方*2的二次方,
F[5]的因子个数等于5的一次方*4的一次方*3的二次方*2的三次方,
F[6]的因子个数等于6的一次方*5的一次方*4的二次方*3的三次方*2的五次方,
F[7]的因子个数等于7的一次方*6的一次方*5的二次方*4的三次方*3的五次方*2的八次方。
注释:不是真的乘起来,而是将指数的(数值+1)乘起来。F[3]的题意值是6,因子有4个。刚好是规律的组合个数,有零次方。
我们发现那些指数就是斐波那契数列啊!!
代码
const
mood=1000000007;
var
n:longint;
boo:array [0..1000001] of boolean;
a,f:array [0..1000001] of longint;
ans:int64;
procedure try1;
var
i:longint;
begin
f[1]:=1; f[2]:=1;
for i:=3 to n do
f[i]:=(f[i-1]+f[i-2]) mod mood;
end;
procedure main;
var
i,j,t:longint;
begin
fillchar(boo,sizeof(boo),false);
fillchar(a,sizeof(a),0);
for i:=2 to n do
if not boo[i] then
begin
a[i]:=f[n-i+1];
j:=i+i;
while j<=n do
begin
boo[j]:=true;
t:=j;
while t mod i=0 do
begin
t:=t div i;
a[i]:=(a[i]+f[n-j+1]) mod mood;
end;
j:=j+i;
end;
end;
end;
procedure print;
var
i:longint;
begin
ans:=1;
for i:=2 to n do
ans:=(ans*(a[i]+1)) mod mood;
write(ans);
end;
begin
readln(n);
try1;
main;
print;
end.