问(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和b的值。并且:当k为偶数时,m = a^2, 当k为奇数时,m = 2*b^2 = a^2 + 1。
参考:https://blog.youkuaiyun.com/qingshui23/article/details/52350523
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
ll N = 2;
const ll M = 1e9 + 7;
struct Node
{
ll a[2][2];
};
Node mul(Node a, Node b)
{
Node result;
memset(result.a, 0, sizeof(result.a));
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N;j++)
{
for(int k = 0; k < N;++k)
{
result.a[i][j] += (a.a[i][k] * b.a[k][j]) % M;
result.a[i][j] %= M;
}
}
}
return result;
}
Node q_pow(Node a, ll n)
{
Node b = a;
while (n > 0)
{
if (n & 1)
{
b = mul(a, b);
}
a = mul(a, a);
n >>= 1;
}
return b;
}
int main()
{
ll n;
Node a;
cin >> n;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
a.a[i][j]=1;
}
}
a.a[0][1] = 2;
a = q_pow(a, n-1);
ll result = a.a[0][0] * a.a[0][0];
if (n & 1)
{
result++;
}
result %= M;
cout << result << endl;
return 0;
}