Warcraft III 守望者的烦恼
Posted acm1ruoji
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Warcraft III 守望者的烦恼相关的知识,希望对你有一定的参考价值。
这道题跟斐波那契数列类似,快速幂矩阵随便推一推就出来了!
#pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define ll long long #define re register #define pb push_back #define fi first #define se second const int N=1e6+10; const int mod=7777777; void read(int &a) { a=0;int d=1;char ch; while(ch=getchar(),ch>‘9‘||ch<‘0‘) if(ch==‘-‘) d=-1; a=ch^48; while(ch=getchar(),ch>=‘0‘&&ch<=‘9‘) a=(a<<3)+(a<<1)+(ch^48); a*=d; } struct note { int a[15][15]; }ans,a; int k,n; note mul(note x,note y) { note c; for(re int i=1;i<=k;i++) { for(re int j=1;j<=k;j++) { c.a[i][j]=0; for(re int l=1;l<=k;l++) c.a[i][j]=(c.a[i][j]+1ll*x.a[i][l]*y.a[l][j]%mod)%mod; } } return c; } note quickmod(note x,int y) { note res,base=x; for(re int i=1;i<=k;i++) for(re int j=1;j<=k;j++) res.a[i][j]=i==j?1:0; while(y) { if(y&1) res=mul(res,base); base=mul(base,base); y>>=1; } return res; } int main() { read(k),read(n); if(n<=k) { ans.a[0][1]=1; for(re int i=1;i<=n;i++) for(re int j=0;j<i;j++) ans.a[i][1]+=ans.a[j][1]; return printf("%d",ans.a[n][1]),0; } for(re int i=1;i<=k;i++) a.a[1][i]=1; for(re int i=2;i<=k;i++) a.a[i][i-1]=1; ans.a[k+1][1]=1; for(re int i=k;i>=1;i--) for(re int j=k+1;j>i;j--) ans.a[i][1]+=ans.a[j][1]; int m=n-k; a=quickmod(a,m); ans=mul(a,ans); printf("%d",ans.a[1][1]); return 0; }
以上是关于Warcraft III 守望者的烦恼的主要内容,如果未能解决你的问题,请参考以下文章
[Vijos1067]Warcraft III 守望者的烦恼(DP + 矩阵优化)
[矩阵乘法][DP]Vijos1067 Warcraft III 守望者的烦恼