题目描述
Description
节日到了,JIH决定给他的m个朋友们送礼物。他一共卖了n件礼物,不同的人对JIH来说重要性不同,对于第i个人,JIH会送wi件礼物给她。JIH想知道有多少种方法把礼物送出去,方案数mod p。
Input
第一行一个整数p
第二行两个整数n,m
第三行开始共m行,每行一个整数表示wi
Output
输出一行,包含一个整数,表示ans mod p的值(数据保证有解)
Sample Input
100
4 2
1
2
Sample Output
12
样例解释:
12种方案如下:
1/23 1/24 1/34
2/13 2/14 /2/34
3/12 3/14 3/24
4/12 4/13 4/23
Data Constraint
20%的数据n<=10,p为素数
70%的数据n<=10^5,p为素数
100%的数据n,p<=10^9,m<=5
设p=p1^c1*p2^c2*…*pt^ct,pi为质数,保证pi^ci<=10^5
话说自从被XC D了后好久没写题解了啊
辣鸡XC
—2018年6月26日
20%
暴力?
不会
70%
随便推一下式子发现
答案就是
因为p是质数,所以可以用一些奇怪的方法快速算出阶乘的模,之后逆元求解
(至于怎么算这里不太好讲)
其实就当作写挂的100分吧
100%
因为p不是质数,所以不能逆元
但是可以把p拆成
,分别求出每个的值,然后用中国剩余定理合并
(这篇博客讲得不错所以就不写了其实还是懒)
但是拆开之后还不是质数,所以不能逆元
于是我们可以把原数拆成
(p是当前的质数)
因为把p分离了出去,所以x和
互质,可以用欧拉定理求x的逆元
(因为
只有p一个质因子,所以
)
y就直接相减,可以证出y≥0
所以问题变成了如何快速把n!拆成
的形式
当然可以暴力
去拆,但是没什么卵用
比如19!%9 (3^2),要把它拆成
的形式
首先把3的倍数提出来
把3提出来
然后可以发现,前面存在着长度为6 (9/3*2)的循环节
因为前面循环部分和剩余部分的长度不超
,所以直接暴力算
可以发现后面是6! (即n div p,19/3=6),递归求解
因为每次/p,所以递归次数是log级的
每次再暴力乘上模数,也就是再乘个10^5
时间复杂度:O(能过)
后记
话说这题也不难写啊。。。
只是把p^a当成了p*a而已