您的位置:首页 > 其它

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
一行,一个数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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: