題意: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 可以...