HNCPC2019自我補題

2021-10-10 00:27:01 字數 1530 閱讀 6859

演算法:exmp 或者 sam(待學習)題目大意:

給你乙個長度為n(n≤50

n \leq 50

n≤50

)的十進位制 整數。然後給你m(m≤50

m \leq 50

m≤50

)個區間。每個區間的數字累乘 是 9的倍數。問你有多 少種合法的填寫方案(mod 1e9 + 7)?

題目思路:

乙個顯然的條件:對於乙個區間[l,r].只需要區間內含有兩個含3因子的數即可。

那麼令 dp(

i,j,

k)

dp(i,j,k)

dp(i,j

,k) 代表前i位,離i最近的兩個含有3因子的數的位置j,k的合法方案。

乙個確定的狀態(i,

j,k)

(i,j,k)

(i,j,k

),它的前導狀態不太好確定。但是(i,

j,k)

(i,j,k)

(i,j,k

)可以通過下一位填

\轉移到(i+

1,j,

k)

(i+1,j,k)

(i+1,j

,k)通過下一位填

\轉移到(i+

1,k,

i+1)

(i+1,k,i+1)

(i+1,k

,i+1

)通過下一位填

\轉移到(i+

1,i+

1,i+

1)

(i+1,i+1,i+1)

(i+1,i

+1,i

+1)所以利用刷表法。對於乙個狀態,當該狀態有方案且若 在乙個區間的右端點時,j,k都在l右邊。則可以轉移到下乙個狀態。

ac**:

#include

#define ll long long

#define pii pair

#define pb push_back

#define mp make_pair

using

namespace std;

const

int mod =

1e9+7;

ll dp[55]

[55][

55], l[55]

;int

main()

dp[0]

[0][

0]=1

;for

(int i =

0; i < n ; i++)}

}}ll ans =0;

for(

int i = l[n]

; i <= n ; i++

)for

(int j = i; j <= n ; j++

) ans =

(ans + dp[n]

[i][j]

)% mod;

cout << ans << endl;

}return0;

}

2019秦皇島補題

思路 如果環的邊長為k,那麼環的刪邊方案數是2k 1。如果鏈的邊長為k,那麼鏈的刪邊方案數是2k。環的方案數乘以鏈的方案數就是總的方案數 之前沒關同步wa了。include include include includeusing namespace std const int maxn 3e5 1...

2019ccpc哈爾濱補題

因為每個字串只能取乙個,剛開始是覺得全部列舉也不會超,後來想想列舉也要用深搜,所以就先記錄擁有各個字元的串,然後深搜 include using namespace std const int maxn 2e6 10 int t char s maxn vector int v 10 bool vi...

2019山東省賽補題

a題 題解 a題注意看清題目每月三十天每週五天很關鍵,因為每月星期幾是固定的。include define ll long long using namespace std const ll nl 1e5 5 ll a nl ll b nl ll c nl int main else if s tu...