T1:
大力矩阵乘法有40分,我也就会这么做了。
以下为官方题解:
(至今仍然不会常系数线性递推的蒟蒻......)
40分代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 typedef long long int lli; 6 using namespace std; 7 const int maxm=210; 8 const int mod=998244353,base=19260817; 9 10 int now; 11 struct Matrix { 12 lli dat[maxm][maxm]; 13 Matrix(int tpe=0) { 14 memset(dat,0,sizeof(dat)); 15 if( tpe ) for(int i=1;i<=now;i++) dat[i][i] = 1; 16 } 17 lli* operator [] (const int &x) { 18 return dat[x]; 19 } 20 friend Matrix operator * (const Matrix &a,const Matrix &b) { 21 Matrix ret(0); 22 for(int i=1;i<=now;i++) 23 for(int j=1;j<=now;j++) 24 for(int k=1;k<=now;k++) 25 ( ret[i][j] += a.dat[i][k] * b.dat[k][j] % mod ) %= mod; 26 return ret; 27 } 28 }ini,trans,ans; 29 30 int m,a,n; 31 inline void build() { 32 ini = trans = Matrix(0); 33 for(int i=1;i<=now;i++) trans[i][now] = ( a - 1 + mod ) % mod; 34 for(int i=1;i<now;i++) trans[i+1][i] = 1; 35 ini[1][1] = a % mod; 36 for(int i=2;i<=now;i++) ini[1][i] = ini[1][i-1] * a % mod; 37 } 38 inline Matrix fastpow(Matrix base,int tim) { 39 Matrix ret(1); 40 while(tim) { 41 if( tim & 1 ) ret = ret * base; 42 if( tim >>= 1 ) base = base * base; 43 } 44 return ret; 45 } 46 inline lli calc(int nn) { 47 now = nn , build(); 48 if( n <= now ) return ini[1][n]; 49 ans = ini * fastpow(trans,n-now); 50 return ans[1][now]; 51 } 52 inline lli getans() { 53 lli ret = 0 , mul = 1; 54 for(int i=0;i<=m;i++) { 55 ret += calc(i) * mul % mod , 56 ret %= mod , 57 mul = mul * base % mod; 58 } 59 return ret; 60 } 61 62 int main() { 63 scanf("%d%d%d",&m,&a,&n); 64 printf("%lld\n",getans()); 65 return 0; 66 }