JZOJ3449. 【NOIP2013模拟联考3】送礼物(gift) (bzoj2142: 礼物)(中国剩余定理)

题目描述

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%

随便推一下式子发现
答案就是 n ! ( i = 1 m w i ) ( n i = 1 m w i )

因为p是质数,所以可以用一些奇怪的方法快速算出阶乘的模,之后逆元求解
(至于怎么算这里不太好讲
其实就当作写挂的100分吧

100%

因为p不是质数,所以不能逆元
但是可以把p拆成 p i a i ,分别求出每个的值,然后用中国剩余定理合并
(这篇博客讲得不错所以就不写了其实还是懒

但是拆开之后还不是质数,所以不能逆元

于是我们可以把原数拆成 x p y (p是当前的质数)
因为把p分离了出去,所以x和 p a 互质,可以用欧拉定理求x的逆元
(因为 p a 只有p一个质因子,所以 φ ( p ) = p a ( p 1 ) p

y就直接相减,可以证出y≥0


所以问题变成了如何快速把n!拆成 x p y 的形式
当然可以暴力 O ( n ) 去拆,但是没什么卵用

比如19!%9 (3^2),要把它拆成 x 3 y 的形式
19 m o d 9 = ( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ) m o d 9
首先把3的倍数提出来
= ( 1 2 4 5 7 8 10 11 13 14 16 17 19 ) ( 3 6 9 12 15 18 ) m o d 9
把3提出来
= ( 1 2 4 5 7 8 10 11 13 14 16 17 19 ) 3 6 ( 1 2 3 4 5 6 ) m o d 9
然后可以发现,前面存在着长度为6 (9/3*2)的循环节
= ( 1 2 4 5 7 8 ) 2 ( 19 ) 3 6 ( 1 2 3 4 5 6 ) m o d 9
因为前面循环部分和剩余部分的长度不超 p a ,所以直接暴力算
可以发现后面是6! (即n div p,19/3=6),递归求解

因为每次/p,所以递归次数是log级的
每次再暴力乘上模数,也就是再乘个10^5

时间复杂度:O(能过)

后记

话说这题也不难写啊。。。
只是把p^a当成了p*a而已

猜你喜欢

转载自blog.csdn.net/gmh77/article/details/80821733
今日推荐