51nod 1537 分解(矩阵快速幂)

分析:先写出前几项,发现都是有解的.记(1+√2)^n=a+b√2,可以归纳证明,当n为奇数时,m=a^2+1,n为偶数时,m=a^2.写出a的递推式,用矩阵快速幂算一下a即可.

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 const int p=1e9+7;
 6 typedef unsigned long long ull;
 7 ull mat[2][2]={2,1,1,0};
 8 void Copy(ull a[2][2],ull b[2][2]){
 9     for(int i=0;i<2;i++)
10         for(int j=0;j<2;j++)a[i][j]=b[i][j];
11 }
12 void multiple(ull result[2][2],ull a0[2][2],ull b0[2][2]){
13     ull a[2][2],b[2][2];
14     Copy(a,a0);Copy(b,b0);
15     for(int i=0;i<2;i++){
16         for(int j=0;j<2;j++){
17             result[i][j]=0;
18             for(int k=0;k<2;k++)
19                 result[i][j]=(result[i][j]+a[i][k]*b[k][j])%p;
20         }
21     }
22 }
23 void qpow(ull t,ull ans[2][2]){
24     ull y[2][2];
25     Copy(y,mat);
26     ans[0][0]=ans[1][1]=1;
27     ans[0][1]=ans[1][0]=0;
28     ull k=1;
29     while(k){
30         if(k&t){
31             multiple(ans,ans,y);
32         }
33         multiple(y,y,y);
34         k<<=1;
35     }
36 }
37 int main(){
38     ull n;
39     cin>>n;
40     if(n==0)cout<<1<<endl;
41     else if(n==1)cout<<2<<endl;
42     else{
43         ull a[2][2];
44         qpow(n-1,a);
45         ull t=((a[0][0]+a[1][0])*(a[0][0]+a[1][0]))%p;
46         if(n%2)cout<<t+1<<endl;
47         else cout<<t<<endl;
48     }
49     return 0;
50 }
时间: 2024-10-25 22:31:13

51nod 1537 分解(矩阵快速幂)的相关文章

51nod-1537 1537 分解(矩阵快速幂+找规律)

题目链接: 1537 分解 问(1+sqrt(2)) ^n  能否分解成 sqrt(m) +sqrt(m-1)的形式 如果可以 输出 m%1e9+7 否则 输出no Input 一行,一个数n.(n<=10^18) Output 一行,如果不存在m输出no,否则输出m%1e9+7 Input示例 2 Output示例 9 题意: 思路: 发现跟奇数偶数有关系,然后就找出递推式,然后就快速幂,然后就A了; AC代码: #include <iostream> #include <cst

51Nod - 1113 矩阵快速幂

51Nod - 1113 矩阵快速幂 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果. Input 第1行:2个数N和M,中间用空格分隔.N为矩阵的大小,M为M次方.(2 <= N <= 100, 1 <= M <= 10^9) 第2 - N + 1行:每行N个数,对应N * N矩阵中的1行.(0 <= N[i] <= 10^9) Output 共N行,每行N个数,对应M

51nod 算法马拉松18 B 非010串 矩阵快速幂

非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) Input 一个数n,表示长度.(n<1e15) Output 长度为n的非010串的个数.(对1e9+7取模) Input示例 3 Output示例 7 解释: 000 001 011 100 101 110 111 读完题,这样的题目肯定是能找到规律所在的,要不然数据太大根本无法算.假设现在给的

【51Nod 1341】混合序列 矩阵快速幂

题意 给定两个数列\(a_n=pa_{n-1}+r,a_0=0\) , \(b_n=qb_{n-1},b_0=3\) , 求\(\sum_{i=0}^{n}a_i\times b_{n-i} \mod {1e9+7}\) 如果\(n\)的范围是\(1e7\),可以用FFT加速卷积 这题范围过大,所以只能用别的方法 令\(f_n=\sum_{i=0}^{n}a_i\times b_{n-i}\) , 那么\(f_{n+1}=\sum_{i=0}^{n+1}a_i\times b_{n+1-i}=\

51nod 1537分解

题目传送门:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1537 神犇题解传送门:http://blog.csdn.net/qingshui23/article/details/52350523 证明好巧妙,给跪OTZ 题目的式子:$ {\left( {1{\rm{ + }}\sqrt 2 } \right)^{\rm{n}}} $,设其乘开之后为 $ {\rm{a + b}}\sqrt 2 $ 考虑相对的式子:$

51nod 1537 分解

1537 分解 基准时间限制:0.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 问(1+sqrt(2)) ^n  能否分解成 sqrt(m) +sqrt(m-1)的形式 如果可以 输出 m%1e9+7 否则 输出no Input 一行,一个数n.(n<=10^18) Output 一行,如果不存在m输出no,否则输出m%1e9+7 Input示例 2 Output示例 9思路:矩阵快速幂,首先要构造矩阵(1 + √2)*(a + b√2) = (a+2b) + (a+b)

快速幂与矩阵快速幂

快速幂的思路: 仍然是与2 分法有关的算法:(很多O(logN)的算法都是二分法啊...) 但快速幂有个前题,就是数据类型必须满足结合律 对于一般的解法: A^8 = A * A * A * A * A * A * A * A 总共需要7次乘法运算: 将其平均分解: A^8 = (A * A * A * A) * (A * A * A * A) = (A * A * A * A) ^ 2 这样我们就只需要4次乘法运算了: 我们还可以将其再分解: A^6 = [(A * A) * (A * A)]

算法初步:快速乘,快速幂,矩阵快速幂

原创 by zoe.zhang 在刷题的时候遇到了问题,就是当循环或者递推的次数非常大的情况下获取一定结果,这个时候如果作普通运算,那么很容易就超时了,而且有时候结果也大得超范围了,即使是long long类型的也放不下,然后给了提示说是运用快速幂的思想.所以这里对快速幂做了一点思考和探讨. 1.快速乘,快速幂,矩阵快速幂三者的关系 不管是快速乘,还是快速幂算法,实际上都包含了分解问题的思想在里面,将O(n)的复杂度降到O(lgn).学习的时候,一般学习快速幂算法,再由此推广去解决矩阵快速幂问题

51nod1113(矩阵快速幂模板)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 题意:中文题诶- 思路:矩阵快速幂模板 代码: 1 #include <iostream> 2 #define ll long long 3 using namespace std; 4 5 const int mod = 1e9+7; 6 const int MAXN = 1e2+10; 7 int n, m; 8 9 typedef struct