矩阵快速幂入门
递推式
矩阵的构造
其中在1到k处的值应该为2的(k-1)次幂。
如果k>=n的时候结果直接为2的(n-1)次幂,如果k<n那么结果为构造的k*k的矩阵的(n-k)次幂。
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=7777777;
int k,n;
struct node{
ll a[12][12];
node(){
memset(a,0,sizeof(a));
}
node operator*(const node x)const{
node ans;
for(int i=1;i<=k;++i){
for(int j=1;j<=k;++j){
for(int p=1;p<=k;++p){
ans.a[i][j]+=a[i][p]*x.a[p][j];
ans.a[i][j]%=mod;
}
}
}
return ans;
}
};
ll pow_(int b){
node st,mul;
for(int i=1;i<=k;++i){
st.a[1][i]=pow(2,k-i);
mul.a[i][1]=1;
mul.a[i][i+1]=1;
}
while(b){
if(b&1){
st=st*mul;
}
mul=mul*mul;
b>>=1;
}
return st.a[1][1];
}
int main()
{
while(~scanf("%d %d",&k,&n)){
if(k>=n){
printf("%d\n",(int)pow(2,n-1));
continue;
}
printf("%lld\n",pow_(n-k));
}
return 0;
}