记录编号 327695 评测结果 AAAAAAAAAA
题目名称 [Ural 1309] 辩论 最终得分 100
用户昵称 Gravatarkito 是否通过 通过
代码语言 C++ 运行时间 0.015 s
提交时间 2016-10-22 19:03:49 内存使用 0.37 MiB
显示代码纯文本
#include<cstdio>
using namespace std;
#define	fcl	fclose(stdin);	fclose(stdout);	return 0
	#define	SUBMIT
const int p=9973;
int n;
int A[10010],B[10010];
int Qpow(int a,int b){
	int ans=1;
	while(b){
		if(b&1){
			ans*=a;
			ans%=p;
		}
		b>>=1;
		a=a*a;
		a%=p;
	}
	return ans;
}

int main(){
	#ifdef SUBMIT
	freopen("Dispute.in","r",stdin);
	freopen("Dispute.out","w",stdout);
	#endif
	scanf("%d",&n);
	int x,y,a,b;
	A[0]=1;	B[0]=0;
	//把f[n]=g(n,f[n-1])	拆开化简,得到f[n]=f[n-1]*(n^5-n+7)+(-n^5+n^3+ 3*n) 
	//由于mod p 所以f[n]=f[n-1]*((n%p)^5-(n%p)+7)+(-(n%p)^5+(n%p)^3+3*(n%p))
	//设A为π(i=1 to n) (i^5-i+7) ,显然A是个定值。
	//把f[n]一直展开到f[0],就是f[n]=a*f[0]+b的形式。显然a=A。
	//那么设A[i],B[i]满足f[i]=A[i]*f[0]+B[i]。
	//当然了,f[p+i]=A[i]*f[p]+B[i],因为这是完整的一个周期,递推式又回来了。
	for(int i=1;i<=p;++i){
		x=Qpow(i,3);	y=Qpow(i,5);
		a=(y-i+7+p)%p;
		b=(-y+x+3*i)%p;
		A[i]=(A[i-1]*a)%p;
		B[i]=(B[i-1]*a+b)%p;
	}
	int N=n/p,Ans=0;
	for(int i=1;i<=N;++i){
		Ans=(Ans*A[p]+B[p])%p;//先推够完整的周期,其实这里可以用矩阵快速幂,但数据范围并不需要。 
	}
	Ans=(Ans*A[n%p]+B[n%p])%p;
	printf("%d",Ans);
	#ifndef SUBMIT
	getchar();	getchar();
	#endif
	fcl;
}