数数
题目描述
给定正整数 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 ≤ 5, 1 ≤ 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;
(神奇的正解?)
每个偶数(不带限制)的指数型生成函数是 ∑i≥0 xi/i! = ex。每个奇数(限制次数 i 为偶
数)的指数型生成函数是 ∑i≥0 x2i/2i! = (ex + e-x)/2。
总共有 ⌈m/2⌉ 个奇数和 ⌊m/2⌋ 个偶数,那么全部乘起来就是
((ex + e-x)/2)⌈m/2⌉ex⌊m/2⌋
。答案就是它的第 n 次项系数再乘以 n!。
把左边的括号用二项式定理展开,然后每项单独算再加起来就可以了