HDU----(4291)A Short problem(快速矩阵幂)
A Short problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1716 Accepted Submission(s): 631
Problem Description
According to a research, VIM users tend to have shorter fingers, compared with Emacs users. Hence they prefer problems short, too. Here is a short one: Given n (1 <= n <= 1018), You should solve for g(g(g(n))) mod 109 + 7 where g(n) = 3g(n - 1) + g(n - 2) g(1) = 1 g(0) = 0
Input
There are several test cases. For each test case there is an integer n in a single line. Please process until EOF (End Of File).
Output
For each test case, please print a single line with a integer, the corresponding answer to this case.
Sample Input
0 1 2
Sample Output
0 1 42837
Source
2012 ACM/ICPC Asia Regional Chengdu Online
此题出得比较精妙,
分析:假设g(g(g(n)))=g(x),x可能超出范围,但是由于mod 10^9+7,所以可以求出x的循环节
求出x的循环节后,假设g(g(g(n)))=g(x)=g(g(y)),即x=g(y),y也可能非常大,但是由x的循环节可以求出y的循环节
如何求循环节点:
1 /*采用事先处理自己可以求出来*/
2 LL work(LL mod){
3 LL a=0,b=1;
4 for(LL i=2;;++i)
5 {
6 a=(b*3+a)%mod;
7 a=a^b;
8 b=a^b;
9 a=a^b;
10 if(a == 0 && b == 1) return i;
11 }
所以依次将mod1带入得到mod2=222222224;
然后将mod2带入得到mod3=183120;
然后就是快速矩阵了。
代码:
1 //#define LOCAL
2 #include<iostream>
3 #include<cstdio>
4 #include<cstring>
5 #define LL __int64
6 using namespace std;
7 const int mod1 =1000000007;
8 const int mod2=222222224;
9 const int mod3=183120;
10
11 LL mat[2][2];
12 LL ans[2][2];
13 LL n;
14
15 void Matrix(LL a[][2],LL b[][2],LL mod)
16 {
17 LL cc[2][2]={0};
18 for(int i=0;i<2;i++)
19 {
20 for(int j=0;j<2;j++)
21 {
22 for(int k=0;k<2;k++)
23 {
24 cc[i][j]=(cc[i][j]+a[i][k]*b[k][j])%mod;
25 }
26 }
27 }
28 for(int i=0;i<2;i++)
29 {
30 for(int j=0;j<2;j++)
31 {
32 a[i][j]=cc[i][j];
33 }
34 }
35 }
36
37 void pow(LL w,LL mod)
38 {
39 while(w>0)
40 {
41 if(w&1) Matrix(ans,mat,mod);
42 w>>=1;
43 if(w==0)break;
44 Matrix(mat,mat,mod);
45 }
46 }
47 void input(LL w,LL mod)
48 {
49 mat[0][0]=3;
50 mat[0][1]=mat[1][0]=1;
51 mat[1][1]=0;
52 ans[0][0]=ans[1][1]=1;
53 ans[0][1]=ans[1][0]=0;
54 pow(w,mod);
55 // printf("%I64dn",ans[0][0]);
56 }
57 void work(int i,__int64 w)
58 {
59 if(i==4||w==0||w==1)
60 {
61 if(w==0)
62 printf("0n");
63 else if(w==1)
64 printf("1n");
65 else
66 printf("%I64dn",ans[0][0]);
67 return ;
68 }
69 LL mod;
70 if(i==1)mod=mod3;
71 else if(i==2)mod=mod2;
72 else if(i==3)mod=mod1;
73 input(w-1,mod);
74 work(i+1,ans[0][0]);
75 }
76 int main()
77 {
78 #ifdef LOCAL
79 freopen("test.in","r",stdin);
80 #endif
81 while(scanf("%I64d",&n)!=EOF)
82 work(1,n);
83 return 0;
84 }
- Java后端WebSocket的Tomcat实现
- jwplayer 隐藏属性方法记载
- TensorFlow从0到1丨开篇:Hello TensorFlow !
- JS原型继承和类式继承
- 在Servlet的init方法中创建线程
- TensorFlow从0到1丨第2篇:TensorFlow核心编程
- AngularJS中的按需加载ocLazyLoad
- AngularJS driective 封装 自动滚动插件
- java类过滤器,防止页面SQL注入
- Web项目添加Maven支持
- Jquery 获取第一个子元素
- Dropwizard框架入门
- Java 解析Excel文件为JSON
- SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter基础widgets教程-FractionallySizedBox篇
- 关于myeclipse控制台输出中文乱码的问题
- nutz 自定义查询 分页 取值
- jquery-uploadifyv3.2.1 文件上传插件 学习
- Flutter基础widgets教程-Icon篇
- Redis:持久化
- Flutter基础widgets教程-IconButton篇
- Flutter基础widgets教程-Image篇
- Go - 学习 grpc.Dial(target string, opts …DialOption) 的写法
- Flutter基础widgets教程-IntrinsicHeight篇
- Flutter基础widgets教程-Baseline篇
- springcloud本地开发的微服务如何调用远程k8s的微服务
- Flutter基础widgets教程-LimitedBox篇
- 算法:滑动窗口(二)
- Flutter基础widgets教程-LinearProgressIndicator篇