@codeforces - 1096G@ Lucky Tickets
目錄
- @description@
 - @solution@
 - @accepted code@
 - @details@
 
@description@
已知一個數(允許前導零)有 n 位(n 為偶數),并知道組成這個數的數字集合(并不一定要把集合內的數用完)。求有多少種可能,使得這個數前半部分的數位和等于后半部分的數位和。
 模 998244353。
input
 第一行兩個整數:n k。表示這個數的位數以及組成這個數的數字集合大小。2 <= n <= 2*10^5,1 <= k <= 10。
 第二行 k 個兩兩不同的整數 d1,d2,...,dk,表示組成這個數的數字集合。0 <= di <= 9。
output
 輸出可能數,模 998244353。
sample input
 4 2
 1 8
sample output
 6
sample explain
 6 種可能分別是:1111,1818,8118,1881,8181,8888。
@solution@
模數暗示 NTT。
如果長度為 n/2,數位和為 s 的數有 k 種,則它對答案的貢獻為 \(k^2\)。
 問題等價于求,長度為 n/2,數位和為 0,1,2,... 的數有多少種。
 我們于是可以 dp。定義狀態 \(dp[i][j]\) 表示長度為 i 的數,數位和為 j 的方案數。
 定義 \(f\),使得 \(f[d[i]]=1(1\le i \le k)\)。可以得到狀態轉移方程:
\[dp[i][j] = \sum_{k=0}^{9}dp[i-1][j-k]*f[k]\]
嗯好的這是一個卷積形式的 dp,我們可以用 NTT 來優化。
 可以得到 \(dp[\frac{n}{2}][j] = f^{\frac{n}{2}}[j]\)。
 轉換成點值形式后直接快速冪再轉換回來。
@accepted code@
#include<cstdio> #include<algorithm> using namespace std; const int G = 3; const int MOD = 998244353; const int MAXN = 200000*9*2; int pow_mod(int b, int p) {int ret = 1;while( p ) {if( p & 1 ) ret = 1LL*ret*b%MOD;b = 1LL*b*b%MOD;p >>= 1;}return ret; } void ntt(int A[], int n, int type) {for(int i=0,j=0;i<n;i++) {if( i < j ) swap(A[i], A[j]);for(int l=(n>>1);(j^=l)<l;l>>=1);}for(int s=2;s<=n;s<<=1) {int t = (s >> 1);int u = (type == 1) ? (pow_mod(G, (MOD-1)/s)) : (pow_mod(G, (MOD-1)-(MOD-1)/s));for(int i=0;i<n;i+=s) {for(int p=1,j=0;j<t;j++,p=1LL*p*u%MOD) {int x = A[i+j], y = 1LL*A[i+j+t]*p%MOD;A[i+j] = (x + y)%MOD, A[i+j+t] = (x + MOD - y)%MOD;}}}if( type == -1 ) {int inv = pow_mod(n, MOD-2);for(int i=0;i<n;i++)A[i] = 1LL*A[i]*inv%MOD;} } int f[MAXN + 5]; int main() {int n, k, d, mx = 0;scanf("%d%d", &n, &k);for(int i=1;i<=k;i++) {scanf("%d", &d);mx = max(mx, d);f[d] = 1;}int len; for(len = 1;len <= ((n>>1)*mx);len<<=1);ntt(f, len, 1);for(int i=0;i<len;i++)f[i] = pow_mod(f[i], (n>>1));ntt(f, len, -1);int ans = 0;for(int i=0;i<len;i++)ans = (ans + 1LL*f[i]*f[i]%MOD)%MOD;printf("%d\n", ans); }@details@
連續做了幾天多項式毒瘤算法,做一個卷積優化是真的輕松愜意。
我才不會說因為 mx 沒有弄初值 RE 了讓我懵逼了好久。
我怎么可能會因為傻逼錯誤做不出來傻逼題。
轉載于:https://www.cnblogs.com/Tiw-Air-OAO/p/10197674.html
總結
以上是生活随笔為你收集整理的@codeforces - 1096G@ Lucky Tickets的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: CF724E Goods transpo
 - 下一篇: GALV_maptravel研究分析(1