URAL 1860 fiborial

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



文件没去,去掉文件之后AC。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值