2 条题解
-
2
如果你不想推公式。
钦定中间块颜色,转化成环染色。直接讨论 与 是否相同,如果相同,把 到 看成一个块,答案是 ,如果不同,直接忽略 ,令 与 相接,答案是 。于是有 ,矩阵加速即可。
#include<iostream> #include<algorithm> #include<vector> #define int long long using namespace std; const int MOD=1e9+7; int n,m; struct matrix{ int n,m; int num[2][2]; matrix operator*(const matrix& mtrx)const{ matrix res={n,mtrx.m,{{0,0},{0,0}}}; if(m!=mtrx.n) return res; for(int i=0;i<n;i++) for(int j=0;j<mtrx.m;j++) for(int k=0;k<m;k++) (res.num[i][j]+=num[i][k]*mtrx.num[k][j])%=MOD; return res; } }I={2,2,{{1,0},{0,1}}},A,T,Ans; matrix qpow(matrix x,int b){ matrix res=I; for(;b;b>>=1,x=x*x) if(b&1) res=res*x; return res; } signed main(){ ios::sync_with_stdio(0); cin.tie(0); while(cin>>n>>m){ if(n==1){ cout<<m*(m-1)%MOD<<'\n'; continue; } A={2,1,{{(m-1)*(m-2)%MOD},{0}}}; T={2,2,{{m-3,m-2},{1,0}}}; Ans=qpow(T,n-2)*A; cout<<Ans.num[0][0]*m%MOD<<'\n'; } return 0; }
- 1
信息
- ID
- 250
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 39
- 已通过
- 10
- 上传者