#include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <iostream> #include <algorithm> using namespace std; #define LL long long const LL mod=1e9+7; struct matrix{ LL f[2][2]; }; matrix mul(matrix a,matrix b)//矩阵乘法 { matrix c; LL i,j,k; memset(c.f,0,sizeof(c.f)); for(i=0;i<2;i++) { for(j=0;j<2;j++) for(k=0;k<2;k++) c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%mod; } return c; } matrix ksm(matrix e,LL n)//快速幂 { matrix s; s.f[0][0]=s.f[1][1]=1; s.f[0][1]=s.f[1][0]=0; while(n) { if(n&1) s=mul(s,e); e=mul(e,e); n=n>>1; } return s; } matrix e; int main() { LL n,m,k; while(cin>>n>>m>>k) { e.f[0][0]=m-k;e.f[0][1]=k; e.f[1][0]=m-k;e.f[1][1]=k-1; e=ksm(e,n-1); LL ans; ans=((m-k)*e.f[0][0]+k*e.f[1][0]+(m-k)*e.f[0][1]+k*e.f[1][1])%mod; cout<<ans<<endl; } return 0; } /* 回顾矩阵题,再写了遍(把转的删了,嘿嘿),下面说明下思路: f[i],表示前i-1个人的选择,且第i个人选择大于k的值 g[i], 表示前i-1个人的选择,且第i个人选择小于k的值 可得到递推式 f[i]=(m-k)*f[i-1]+(m-k)*g[i-1] g[i]=k*f[i-1]+(k-1)*g[i-1] 可得到矩阵: |f[i] g[i]|=|f[i-1] g[i-1]|*|m-k k | |m-k k-1| |f[n] g[n]|=|f[1] g[1]|* |m-k k |^(n-1) |m-k k-1| ans=f[n]+g[n]; */