Ural 1309 Dispute (递归)
2015-07-02 15:33
309 查看
意甲冠军:
给你一个数列:
f(0) = 0
f(n) = g(n,f(n-1))
g(x,y) = ((y-1)*x^5+x^3-xy+3x+7y)%9973
让你求f(n) n <= 1e8
思路:
令m = 9973
easy观察g(x,y) = g(x%m,y)
f(x+m) = g( (x+m) %m , f(x+m-1))........
能够得到 f(x+m) = (A*f(x)+B)%m
f(x+2m) = (A*f(x+m)+B)%m
,.....
令x+km = n
先求出f(x) 在求出A,B然后算出f(n)
给你一个数列:
f(0) = 0
f(n) = g(n,f(n-1))
g(x,y) = ((y-1)*x^5+x^3-xy+3x+7y)%9973
让你求f(n) n <= 1e8
思路:
令m = 9973
easy观察g(x,y) = g(x%m,y)
f(x+m) = g( (x+m) %m , f(x+m-1))........
能够得到 f(x+m) = (A*f(x)+B)%m
f(x+2m) = (A*f(x+m)+B)%m
,.....
令x+km = n
先求出f(x) 在求出A,B然后算出f(n)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int m = 9973; int A,B; int n; int x,cnt; int getX5(int x){ int ret = 1; for(int i = 1; i <= 5; i++) { ret = (x*ret)%m; } return ret; } int getX3(int x) { int ret = 1; for(int i = 1; i <= 3; i++) { ret = (ret*x)%m; } return ret; } int getPos(int x) { return (x%m+m)%m; } int func(int n) { if(n==0) return 0; return getPos((getPos(getX5(n)-n+7)*func(n-1))%m+getPos((-getX5(n)+getX3(n)+3*n))); } void solve() { A = 1; B = 0; int ret = func(x); for(int i = x+m; i >= x+1; i--) { int k = i%m; B = (B+A*getPos((-getX5(k)+getX3(k)+3*k)))%m; A = (A*getPos(getX5(k)-k+7))%m; } for(int i = 1; i <= cnt; i++) { ret = (A*ret+B)%m; } printf("%d\n",ret); } int main() { while(~scanf("%d",&n)) { x = n%m; cnt = n/m; solve(); } return 0; }
相关文章推荐
- 关于MvcMusicStore购物车中移除功能不起作用
- JS控制消除文本框中的空格符号
- 如何修改 VC6.0 4.0 2010 打印预览界面上的文字
- 高并发下的系统设计(偏数据库设计)
- shell基础学习
- C 语言----宿舍管理系统 课程设计
- 完数
- web的三种监听器
- 设计模式——工厂方法模式
- 原生javascript怎样控制form表单的提交和阻止提交
- windows 10 10130应用商店闪退怎么办?
- 仿QQ控件右上角按钮
- Codeforces Round #311 (Div. 2) —— C
- Android:Layout_weight的理解
- 黑马day12 数据库之元数据
- ArcGIS教程:面积制表
- ios之UIScrollerView滚动视图
- 对于空字符串split()操作获取的数组的长度为1解释
- 欢迎使用CSDN-markdown编辑器
- shu_1241 邮局位置问题