训练时突然发现了这么一道题:
一个数字被称为好数字当他满足下列条件:
1. 它有2*n个数位,n是正整数(允许有前导0)
2. 构成它的每个数字都在给定的数字集合S中。
3. 它前n位之和与后n位之和相等或者它奇数位之和与偶数位之和相等
例如对于n=2,S={1,2},合法的好数字有 1111,1122,1212,1221,
2112,2121,2211,2222这样8种。
已知n,求合法的好数字的个数mod 999983。
一道很明显的DP。虽然楼主一开始就设错了方程式……
我们设f[i][j]为构造的,长度为i且序列所有数字和为j的方案数。
不难得:f[i][j]=sigma(i=1~N,j=0~i*Max_Num,k=1~S) f[i-1][j-num[k]]
当我们重铸序列后,得出的方案数就能算答案了。
考虑第一种情况:(要求前n为与后n为和相同)因为序列是2*n的,所以只要将两串 和相等且均为n的序列拼在一起就能符合要求。
Ans+=sigma(i=0~N*Max_Num) f[n][i]^2。
考虑第二种情况:(要求奇偶数位上的数和相等)同样是有2个n序列构成的,所以对答案的贡献与第一种相同。
Ans+=sigma(i=0~N*Max_Num) f[n][i]^2。