[NOIP模拟测试]:随(快速幂+数学)

题目描述

给出$n$个正整数$a_1,a_2...a_n$和一个质数mod。一个变量$x$初始为$1$。进行$m$次操作.每次在$n$个数中随机选一个$a_i$,然后$x=x\times a_i$.问$m$次操作之后$x$的取值的期望。答案一定可以表示成$\frac{a}{b}$的精确分数形式。$a$和$b$可能很大,所以只需要输出$a\times b^{{10}^9+5}$模${10}^9+7$的结果。


输入格式

第一行三个整数$n,m,mod$。
接下来一行$n$个空格隔开的正整数$a_1,a_2...a_n$。


输出格式

一行一个整数表示答案。


样例

样例输入

2 1 3
1 2

样例输出

500000005


数据范围与提示

第$1$个测试点:$mod=2$。
第$2$个测试点:$n=1$。
第$3,4,5$个测试点:$m\leqslant 1,000,1\leqslant mod \leqslant 300$。
第$6,7,8$个测试点:$1\leqslant mod \leqslant 300$。
对于全部测试点:$1\leqslant a_i <mod,mod$为质数$1\leqslant mod \leqslant 1,000,1\leqslant n\leqslant {10}^5,1\leqslant m\leqslant {10}^9$。


吕老师教你学数学
质数$P$的原根$g$满足$1\leqslant rt<P$,且$rt$的$1$次方,$2$次方$...(P-1)$次方在模$P$意义下可以取遍$1$到$(P-1)$的所有整数。
欧拉定理:对于质数$P,1\leqslant x<P$的任意$x$的$(P-1)$次方在模$P$意义下都为$1$。
显然,原根的$1$次方,$2$次方$...(P-2)$次方在模$P$意义下都不为$1$,只有$(P-1)$次方在模$P$意义下为$1$。
这也是一个数成为原根的充分必要条件。


题解

第$1$个测试点:

$mod=2$,不要慌,不用考虑$mod$完会有$0$的情况,因为$1\leqslant a_i <mod$,于是$a_i$一定是$1$,所以$x$就是$1$,直接$puts("1");return 0;$就好了。

第$2$个测试点:

$n=1$,因为每次只能选这一个数,所以快速幂直接搞就好了。

第$3,4,5$个测试点:

考虑$DP$,定义$dp[i][j]$表示第$i$次操作后$x$为$j$的概率。

那么我们能写出$DP$式子:$dp[i][j\times a[k]\% mod]=\sum \limits_{k=1}^ndp[i-1][[j]$。

时间复杂度:$\Theta (n\times m\times mod)$。

但是注意到$3,4,5$这三个测试点并没有对$n$的范围加以约束,所以显然会$T$飞起,那么我们考虑优化这个$DP$。

接着注意$1\leqslant a_i <mod$,所以一共最多会有$mod-1$种不同的$a_i$,试图从这里入手。

开一个数组$sum[i]$记录$i$这个数出现的次数。

那么$DP$式子即可转化为:$dp[i][j\times k\%mod]=\sum \limits_{k=0}^{mod-1}dp[i-1][j]\times sum[k]$。

猜你喜欢

转载自www.cnblogs.com/wzc521/p/11256711.html
今日推荐