2019.10.6 Oi模拟赛总结T3:线性DP

数数
题目描述
给定正整数 n; m。请问存在多少个长度为 n 的数组 (a1; a2; : : : ; an) 满足下面的性质。
对于每个 1 i n,都有 1 ai m
对于所有满足 1 j m 奇数 j,都满足:在数组 (a1; : : : ; an) j 的出现次数是偶数
由于答案可以很大,请输出答案模 109 + 7 的结果。
输入
第一行一个整数 t,表示有 t 组询问。
接下来 t 行,每行有两个空格隔开的正整数 n; m
输出
输出 t 行答案。
样例输入
2
3 1
3 2
样例输出
0 4
样例解释
第二个样例的所有可能是 (1; 1; 2); (1; 2; 1); (2; 1; 1); (2; 2; 2)
数据规模与约定
共有 10 个数据。
对于第 1 个数据, n 7; m 7
对于第 2,3 个数据, n 1000; m 10
对于第 4,5 个数据, n 300; m 300
对于第 6 个数据, n 2000; m 2000
对于第 7 个数据, n 100000; m 100000
对于所有的数据, 1 t 51 n 109; 1 m 100000

分析:

1.设f[i][j]表示前i个数,填到第i个数,有j个奇数被填了奇数次的方案总数

2.计算出奇数总数A=ceil(M/2),偶数总数为B=M/2

3.考虑状态转移方程

分为三类数:(1)前i个数被填了偶数次的奇数,(2)前i个数被填了奇数次的奇数,(3)偶数

mod=1e9+7;

考虑在i+1处放置这三类数:

(1)时,被填了奇数次的数会增多一个 即f[i+1][k+1]+=f[i][k]*(A-k)%mod;

(2)时,被填了偶数次的数会增多一个,奇数次的数会减少1个 即f[i+1][k-1]+=f[i][k]*k%mod

(3)时,对奇数没有影响 即f[i+1][k]+=f[i][k]*B%mod;

(神奇的正解?)

每个偶数(不带限制)的指数型生成函数是 i0 xi/i! = ex。每个奇数(限制次数 i 为偶
数)的指数型生成函数是 i0 x2i/2i! = (ex + e-x)/2
总共有 m/2个奇数和 m/2个偶数,那么全部乘起来就是
((ex + e-x)/2)m/2exm/2
。答案就是它的第 n 次项系数再乘以 n!
把左边的括号用二项式定理展开,然后每项单独算再加起来就可以了

猜你喜欢

转载自www.cnblogs.com/little-cute-hjr/p/11628426.html