您的位置:首页 > 其它

URAL 1309 Dispute (数学+推导)

2015-10-27 18:52 477 查看
题目链接: http://acm.timus.ru/problem.aspx?space=1&num=1309

题意:f(0) = 0, f(n)
= g(n, f(n-1)), g(x,y) = ((y-1)x5 +
x3 –
xy + 3x + 7y) % 9973

输入n(n<100000000),输出 f(n) 。

思路: f
= f[n-1] *(n^5 - n + 7 ) + n^3 - n^5+3*n.

令k
= n^5 - n + 7 , t
= n^3 - n^5+3*n 。即 f
= k
* f[n-1] + t
;

将上式展开可得 f
= ( t[1]*k[2]*....*k
) + ( t[2]*k[3]*....*k
) +...+ t[n-1]*k
+ t
.

p=n/mod , q=n%mod tmp=k[0]*k[1]*...*k[mod-1]

f
= ( t[mod*0+1]*k[mod*0+2]*....*k
)
+...+ ( t[mod*1] k[mod*1+1]*...* k
) (1)

+( t[mod*1+1]*k[mod*1+2]*....*k
) +...+ ( t[mod*2] k[mod*2+1]*...* k
) (2)

..

+( t[mod*(p-1)+1]*k[mod*(p-1)+2]*....*k
) +...+ ( t[mod*p] k[mod*p+1]*...* k
)
(p)

+( t[mod*p+1]*k[mod*p+2]*....*k
) +...+ t
)

在上式中可看出 式(1) = 式(2) * tmp ;

所以 f
= 式(p)*(1+ tmp + ...+ tmp^(p-1)) +( t[mod*p+1]*k[mod*p+2]*....*k
) +...+ t
).

因为其余部分和式(p) 可以暴力求出。即 可以求出f
了。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int mod=9973;
const int maxn=mod*10;
int k[mod+15],t[mod+15],a[mod+5],n;

int mul(int num,int ct)
{
int ret=1;
num%=mod;
for(int i=1;i<=ct;i++)  ret=ret*num%mod;
return ret;
}

int main()
{
k[0]=7; t[0]=0;
for(int i=1;i<mod+3;i++)
{
k[i]=((7+mul(i,5))%mod-i+mod)%mod;
t[i]=((mul(i,3)-mul(i,5)+mod)%mod+3*i)%mod;
}
int tmp=k[0],sum=0;
for(int i=mod-1;i>=1;i--)
{
a[i]=tmp*t[i]%mod;
sum=(sum+a[i])%mod;
tmp=tmp*k[i]%mod;
}
while(scanf("%d",&n)!=EOF)
{
int p=n%mod,q=n/mod;
int now=1,ans=0;
for(int i=p;i>=1;i--)
{
ans=(ans+now*t[i]%mod)%mod;
now=now*k[i]%mod;
}
int tp=sum*now%mod;
for(int i=1;i<=q;i++)
{
ans=(ans+tp)%mod;
tp=tmp*tp%mod;
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: