参考:http://blog.csdn.net/qingshui23/article/details/52350523
标程中提到了构造对偶式,我去,这咋整啊,搞不了
但是就根据标程来推,这些东西都能推出来。。。
奇偶都能推出来sqrt(m)+sqrt(m−1)=a+b∗sqrt(2)
然后根据(1+√2)^n=a+b∗2打个表,找规律就好了。找不到规律的话,拿着序列去oeis一查就知道了
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n;
typedef vector<LL> vec;
typedef vector<vec> mat;
const LL mod = 1e9+7;
mat mul(mat& A, mat &B)
{
mat C(A.size(),vec(B[0].size()));
for(int i = 0; i < A.size(); ++i)
for(int k = 0; k < B.size(); ++k)
for(int j = 0; j < B[0].size(); ++j)
C[i][j] = (C[i][j]+A[i][k]*B[k][j])%mod;
return C;
}
mat pow(mat A, LL n)
{
mat B(A.size(),vec(A.size()));
for(int i = 0; i < A.size(); ++i)
B[i][i] = 1;
while(n > 0)
{
if(n&1) B = mul(B,A);
A = mul(A,A);
n >>= 1;
}
return B;
}
void debug(mat& res)
{
cout << res[0][0] << " " << res[0][1] <<endl;
cout << res[1][0] << " " << res[1][1] << endl;
return ;
}
LL solve()
{
mat A(2,vec(2));
A[0][0] = 1;
A[0][1] = 2;
A[1][0] = 1;
A[1][1] = 1;
mat res = pow(A,n);
LL ans = res[0][0]%mod;
ans = ((ans%mod)*(ans%mod))%mod;
if(n&1)
return (ans+1)%mod;
else
return ans;
}
int main()
{
cin >> n;
cout << solve() << endl;
return 0;
}