BZOJ 1009 GT考試 KMP 矩陣快速冪

2021-08-08 02:04:43 字數 938 閱讀 2729

題意:b為非法數字b[1]...b[m],其位數<=20.某個數有n位,每位可以填入[0,9].

n<=1e9 問有多少種填數字方案,滿足n位中沒有非法數字m出現?

先不考慮n範圍 則可以設定dp[i][j]表示放了合法放了前i位,其字尾j和非法的前j位相同的方法數.

轉移狀態顯然是一位一位新增

顯然dp[i+1][j+1]+=dp[i][j] 新增b[j+1] 

若新新增的a[i+1]!=b[j+1] 算出此時a的字尾能匹配b的最長字首是多少.

聯想到kmp,列舉匹配到i然後再列舉新新增字元a[i+1]後,算出此時能匹配的最長字首.從而得到矩陣p.

p[k][j]表示新增乙個字元,使匹配前k個字元到匹配前j個字元的方案數.

則dp方程表示為 dp[i][j]= sigma(dp[i-1][k]*p[k][j]) (k=[0,m-1]) 

n<=1e9 新增n次 則利用矩陣冪優化.答案為a[i][0]累加(初始匹配0個到i個)

#include using namespace std;

typedef long long ll;

const int n=35;

int n,m,mod;

int fail[n];

char s[n];

int a[n][n],b[n][n];

void mul(int a[n][n],int b[n][n],int ans[n][n])

for(int i=0;i0&&s[t+1]-'0'!=j)

t=fail[t];

if(s[t+1]-'0'==j)

t++;

if(t!=m)

b[t][i]=(b[t][i]+1)%mod;//i->t

} }for(int i=0;i>=1;

} int sum=0;

for(int i=0;i

bzoj1009 GT考試 dp 矩陣快速冪

題意 構造乙個字串 數字0 9 不含乙個子串的個數 我這麼蒟蒻腫麼可能想到是dp嘛 定義f i j 表示當前構造了i位,與模式串p匹配了前j位的方案數 然後列舉下一位填什麼,然後乘上當前構造出來的和模式串匹配到k的方案數。即是f i 1 k f i j a j k 因為從j轉移到k,可以用的數字不一...

BZOJ 1009 GT考試(dp 矩陣快速冪)

description 阿申準備報名參加gt g t考試,准考證號為 n n 位數x1 x2.xn 0 x i 9 role presentation style position relative x1x 2.xn 0 x i 9 x1x2.xn 0 x i 9 他不希望准考證號上出現不吉利的數字...

矩陣乘法 GT考試

阿申準備報名參加 gt 考試,准考證號為 nn 位數 x1x2 xnx1x2 xn 他不希望准考證號上出現不吉利的數字。他的不吉利數字 a1a2 ama1a2 am 有 mm 位,不出現是指 x1x2 xnx1x2 xn 中沒有恰好一段等於 a1a2 ama1a2 am a1a1 和 x1x1 可以...