日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

1305. GT考试

發(fā)布時(shí)間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1305. GT考试 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1305. GT考試

題意:

準(zhǔn)考證長(zhǎng)度為n位,不吉利數(shù)字有m位,問(wèn)不出現(xiàn)不吉利數(shù)字的準(zhǔn)考證有多少種,答案mod K

題解:

動(dòng)態(tài)規(guī)劃+kmp+矩陣快速冪
設(shè)dp[i][j]表示長(zhǎng)度為i,且不包含S串,且末尾部分與S串的前綴匹配的最大長(zhǎng)度是j的所有字符串的集合
S串為不吉利數(shù)字


現(xiàn)在相同部分為j,再黃色串后面再添加一個(gè)新數(shù),有10種選擇0~9,
如果添加的正好等于紅色對(duì)應(yīng)部分,那j++
如果不等于,就重新匹配最長(zhǎng)部分,該如何快速匹配?用kmp的next數(shù)組,k=next[k],實(shí)現(xiàn)快速匹配最長(zhǎng)長(zhǎng)度
轉(zhuǎn)移方程:
dp[i+1][k]+=dp[i][k]

我們現(xiàn)在考慮兩層狀態(tài)之間的關(guān)系,即dp[i+1][…]與dp[i][…]的關(guān)系,我們可以列出這個(gè)式子
dp[i+1,0]=a00 * dp[i,0] +a01 * dp[i,1]…+
dp[i+1,1]=a10 * dp[i,0] + a11 * dp[i,1]+…+

而這些a可以組成一個(gè)矩陣A
由此可以得到:
dp[i+1] = dp[i] *A
所以dp[n] = f[n-1] *A =…=F[0] * An
F[0]表示長(zhǎng)度為0的情況,F[0] = 1
A怎么得到?我們已經(jīng)說(shuō)過(guò), dp[i+1][k]+=dp[i][k],也就是dp[i+1] = dp[i] *A,所以我們就把dp[i][k]加到對(duì)應(yīng)的小a上即可,也就是動(dòng)態(tài)規(guī)劃里的狀態(tài)我們加到A矩陣?yán)?#xff0c;然后A求n-1次冪(矩陣快速冪)

代碼:

#include<bits/stdc++.h> #define debug(a,b) printf("%s = %d\n",a,b) typedef long long ll; using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } const int maxn=35; int n,m,mod; char str[maxn]; int ne[maxn]; int a[maxn][maxn]; void mul(int c[][maxn],int a[][maxn],int b[][maxn]) {static int t[maxn][maxn];memset(t,0,sizeof(t));for(int i=0;i<m;i++){for(int j=0;j<m;j++){for(int k=0;k<m;k++){t[i][j]=(t[i][j]+a[i][k]*b[k][j])%mod;}}}memcpy(c,t,sizeof(t)); } int qmi(int k) {int f0[maxn][maxn]={1};while(k){if(k&1)mul(f0,f0,a);//f0=f0*amul(a,a,a);//a=a*ak>>=1;}int res=0;for(int i=0;i<m;i++)res=(res+f0[0][i])%mod;return res; } int main() {cin>>n>>m>>mod;cin>>str+1;for(int i=2,j=0;i<=m;i++){while(j&&str[j+1]!=str[i])j=ne[j];if(str[j+1]==str[i])j++;ne[i]=j; }//初始化A矩陣 for(int j=0;j<m;j++){for(int c='0';c<='9';c++){int k=j;while(k&&str[k+1]!=c)k=ne[k];if(str[k+1]==c)k++;if(k<m)a[j][k]++;}}//F[n]=F[0]*A^ncout<<qmi(n)<<endl;return 0; }

總結(jié)

以上是生活随笔為你收集整理的1305. GT考试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。