演算法: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...