51nod 1537 分解
2016-09-28 22:38
218 查看
1537 分解
基准时间限制:0.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
问(1+sqrt(2)) ^n 能否分解成 sqrt(m) +sqrt(m-1)的形式
如果可以 输出 m%1e9+7 否则 输出no
Input
Output
Input示例
Output示例
基准时间限制: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 [a+2b] = [1 2] *[a] [a+ b] [1 1] [b] 最后要判别一下n为奇数和偶数的情况
#include <cstdio> #include <iostream> #include <cstring> const int mod = 1e9+7; using namespace std; struct mat { long long int a[3][3]; mat() { memset(a, 0, sizeof(a)); } mat operator *(const mat &o) const { mat t; for(int i = 1; i <= 2; i++) { for(int j = 1; j <= 2; j++) for(int k = 1; k <= 2; k++) { t.a[i][j] = (t.a[i][j] + a[i][k]*o.a[k][j]%mod)%mod; } } return t; } } a, b; int main() { long long n, tmp; while(~scanf("%I64d", &n)) { tmp = n; a.a[1][1] = a.a[2][2] = 1, a.a[1][2] = a.a[2][1] = 0; b.a[1][1] = b.a[2][1] = b.a[2][2] = 1, b.a[1][2] = 2; while(n > 0) { if(n&1) { a = b*a; n--; } n >>= 1; b = b*b; } long long int m = (a.a[1][1]*a.a[1][1] + (tmp%2)) %mod; printf("%I64d\n", m); } return 0; }
相关文章推荐
- 51nod-1537分解
- 51NOD 1537 分解
- 51nod 1537 分解(矩阵快速幂)
- 51nod 1537 分解 (矩阵快速幂)
- 51nod 1537 分解(矩阵快速幂)
- 51nod-1537 1537 分解(矩阵快速幂+找规律)
- 51NOD 1537 分解(矩阵快速幂)——算法马拉松17(告别奥运)
- [51nod 1537]分解
- 51nod 1537 分解
- 51nod 1383 整数分解为2的幂
- 51nod 1400 序列分解(DFS + 剪枝)
- 51Nod 1048 整数分解为2的幂 V2
- 51Nod 1537 数论+思维
- 51node 1537 分解
- 51nod 1383 整数分解为2的幂【递推】
- 51nod-1383 整数分解为2的幂
- 51nod 40 序列分解 暴力dfs or 折半+字典树
- 51nod 1400 序列分解(深搜)
- 51nod 整数分解为2的幂
- 51nod 1400 序列分解【Dfs+剪枝】好题~