问(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
题解:orz。。。
代码:
#include<bits/stdc++.h>
using namespace std;
int i,j,ii;
long long n,m,a[3][3],b[3][3],c[3][3];
int main(){
scanf("%lld",&n);
a[1][1]=a[2][1]=a[2][2]=1;
a[1][2]=2;
b[1][1]=b[2][2]=1;
m=n;
n--;
while(n){
if(n%2){
memset(c,0,sizeof(c));
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
for(ii=1;ii<=2;ii++)
c[i][j]+=b[i][ii]*a[ii][j];
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)b[i][j]=c[i][j]%1000000007;
}
memset(c,0,sizeof(c));
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
for(ii=1;ii<=2;ii++)
c[i][j]+=a[i][ii]*a[ii][j];
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)a[i][j]=c[i][j]%1000000007;
n/=2;
}
if(m%2==0)printf("%lld",(b[1][1]+b[1][2])*(b[1][1]+b[1][2])%1000000007);
else printf("%lld",((b[1][1]+b[1][2])*(b[1][1]+b[1][2])+1)%1000000007);
}