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
了。
题意: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; }
相关文章推荐
- 继续linux学习
- java中的抽象类与接口
- Git常用命令(转)
- Android引入高速缓存的异步加载全分辨率
- Android 基础控件 TextView
- 用Binary Viewer查看H264文件中的每一帧
- beggo 模板函数
- nginx rewite指令模块
- 行为型模式之一——职责链模式
- 导向滤波磨皮 算法的实现
- IO字符流之读写缓冲区(BufferedWriter、BufferedReader)
- c++单链表基本操作
- python 学习笔记(01)
- 第七周数据结构之自建算法库——顺序环形队列【项目2 - 建立链队算法库】
- 【工具】字符串 加密 解密 不可逆加密 拆分 合并
- 优化IDE - IntelliJ IDEA中添加自动生成slf4j的日志模板
- 利用java反射分析类的能力
- Caffe运行自带Demo出现Unknown layer type错误解决
- uboot的编译问题
- 图解classloader加载class的流程及自定义ClassLoader