51nod1537 分解
http://blog.csdn.net/qingshui23/article/details/52350523 详细题解%%%%
对矩阵乘法的不熟悉。以及不会推公式
#include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c) memset(x,c,sizeof(x)) #define ll long long const ll mod=1e9+7; struct node{ ll a[3][3]; node(){ clr(a,0);} node operator*(const node&o)const{ node t; rep(i,1,2) rep(j,1,2) rep(k,1,2) t.a[i][j]=(t.a[i][j]+a[i][k]*o.a[k][j]%mod)%mod; return t; } }a,b; int main(){ ll n;scanf("%lld",&n);ll tmp=n; a.a[1][1]=a.a[2][2]=1; b.a[1][1]=b.a[1][2]=b.a[2][2]=1;b.a[2][1]=2; while(n){ if(n&1) a=a*b; b=b*b;n>>=1; } ll ans=a.a[1][1]*a.a[1][1]+(tmp%2);ans%=mod; printf("%lld\n",ans); return 0; }
问(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