[Vjudge-URAL 1860 fiborial](http://vjudge.net/problem/URAL-1860)
这道题目就有点麻烦了。。
如果你去尝试模拟一下,你就会看到这个数中“包含”菲波那切数列。。但是在指数上。。
就是说,fn=n^g1+(n-1)^g2+...+2^gn-1; 其中gi是菲波那切数列的第i项。
那么将n质因数分解,只能用线性筛素数,nlogn的复杂度也会被卡掉30分。。同时用一个record数组记录一个数i的最大的质因数,那么一个数i就可以通过不断地除上这个record的第i项得到因数分解。
分解过后,每一个质因子加上当前因子的指数,前文提到过,它是菲波那切数列的某一项。
#include<fstream>
using namespace std;
ifstream in("fiborial.in");
ofstream out("fiborial.out");
const int mod=1000000007,maxn=5000000;
long long int Fibonacci[maxn+1],ans;
int n,f[maxn+1],sushu[maxn+1],num,record[maxn+1];
bool flag[maxn+1];
void read()
{
int i,j,k,l;
std::ios::sync_with_stdio(false);
in>>n;
Fibonacci[0]=1; Fibonacci[1]=1;
for(i=2; i<=n; i++)
{
Fibonacci[i]=Fibonacci[i-1]+Fibonacci[i-2];
Fibonacci[i]%=mod;
}
for(i=2; i<=n; i++)
{
if(flag[i]==false)
{
sushu[++num]=i;
f[i]+=Fibonacci[n-i];
record[i]=i;
}
j=1;
while(sushu[j]*i<=n && j<=num)
{
l=sushu[j]*i;
flag[l]=true;
record[l]=sushu[j];
f[sushu[j]]+=Fibonacci[n-l];
f[sushu[j]]%=mod;
k=i;
while(k!=1)
{
f[record[k]]+=Fibonacci[n-l];
f[record[k]]%=mod;
k/=record[k];
}
if(i%sushu[j]==0)
break;
j++;
}
}
ans=1;
for(i=1; i<=num; i++)
{
ans*=f[sushu[i]]+1;
ans%=mod;
}
out<<ans;
return;
}
int main()
{
read();
return 0;
}