【提高组2018】模拟C组 数字

//补一下博客啊

Description

一个数字被称为好数字当他满足下列条件:

  1. 它有2*n个数位,n是正整数(允许有前导0)

  2. 构成它的每个数字都在给定的数字集合S中。

    1. 它前n位之和与后n位之和相等或者它奇数位之和与偶数位之和相等

    例如对于n=2,S={1,2},合法的好数字有1111,1122,1212,1221,2112,2121,2211,2222这样8种。

已知n,求合法的好数字的个数mod 999983。

Input

第一行一个数n。

接下来一个长度不超过10的字符串,表示给定的数字集合。

Output

一行一个数字表示合法的好数字的个数mod 999983。

Sample Input

2
0987654321

Sample Output

1240

Hint

对于20%的数据,n≤7。

对于100%的.据,n≤1000,|S|≤10。

思路

这题嘛。。。递推!

显然,是个容斥原理。
ans=前n位之和与后n位之和相等的方案数+奇数位之和与偶数位之和相等的方案数-前n位之和与后n位之和相等且奇数位之和与偶数位之和相等的方案数

稍微转换一下最后的一个式子
前n位奇数位之和=后n位偶数位之和 且 前n位偶数位之和=后n位奇数位之和

那么前两个的和就是∑2*f[n][i]*f[n]i

定义

l1为前n个数的奇数个数和后n个数的偶数个数
l2为前n个数的偶数个数和后n个数的奇数个数
即 l1=(n+1)/2 l2=n/2
s1=(s1+f[l1][i]%mod*f[l1][i])%mod;
s2=(s2+f[l2][i]%mod*f[l2][i])%mod;
ans=(ans-s1*s2%mod+mod)%mod

你可能感兴趣的:(题解,递推,容斥原理)