2142: 礼物

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 2286  Solved: 1009
[Submit][Status][Discuss]

Description

一年一度的圣诞节快要来到了。每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物。不同的人物在小E
心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多。小E从商店中购买了n件礼物,打算送给m个人
,其中送给第i个人礼物数量为wi。请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某
个人在这两种方案中收到的礼物不同)。由于方案数可能会很大,你只需要输出模P后的结果。

Input

输入的第一行包含一个正整数P,表示模;
第二行包含两个整整数n和m,分别表示小E从商店购买的礼物数和接受礼物的人数;
以下m行每行仅包含一个正整数wi,表示小E要送给第i个人的礼物数量。

Output

若不存在可行方案,则输出“Impossible”,否则输出一个整数,表示模P后的方案数。

Sample Input

100
4 2
1
2

Sample Output

12
【样例说明】
下面是对样例1的说明。
以“/”分割,“/”前后分别表示送给第一个人和第二个人的礼物编号。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
【数据规模和约定】
设P=p1^c1 * p2^c2 * p3^c3 * … *pt ^ ct,pi为质数。
对于100%的数据,1≤n≤109,1≤m≤5,1≤pi^ci≤10^5。

HINT

 

Source

 

[Submit][Status][Discuss]

数论大集合。

https://blog.csdn.net/clove_unique/article/details/54571216

答案显然$C_n^{n - w[1]}C_{n - w[1]}^{w[2]}C_{n - w[1] - w[2]}^{w[3]}......$,模数不互质成为难点。

扩展Lucas:将模数质因数分解,再用CRT合并。

问题就只剩下求$n!\%p_i^{k_i}$了。

首先由于不互质无法找到逆元,把$n!$中的$p_i$全部取出来:$ans=\lfloor\frac{n}{p}\rfloor+\lfloor\frac{n}{p^2} \rfloor+\lfloor\frac{n}{p^3}\rfloor+...$

然后考虑剩下部分怎么做,用$F(n,p_i,p_i^{k_i})$表示答案,$f(n,p_i,p_i^{k_i})$表示$\prod_{j=1,j\perp p_i}^{n}j(mod\ p_i^{k_i})$,则:

$F(n,p_i,p_i^{k_i})=\lfloor\frac{n}{p_i}\rfloor!\times p_i^{\lfloor\frac{n}{p_i}\rfloor}\times f(p_i^{k_i},p_i,p_i^{k_i})^{\lfloor\frac{n}{p_i^{k_i}}\rfloor}\times f(n\%p_i^{k_i})\%p_i^{k_i}$

递归处理即可,要用到exgcd。

复杂度好像是,$O(\sqrt{P}+m\log_{2}^{2}p_i^{k_i}\log{p_i})$不过肯定跑不满。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=;
ll mod,n,m,w[],ans,x,y,Mod[N],st[N],r[N],num; ll ksm(ll a,ll b,ll p){
ll res;
for (res=; b; a=a*a%p,b>>=)
if (b&) res=res*a%p;
return res;
} ll exgcd(ll a,ll b,ll &x,ll &y){
ll d=a;
if (b) d=exgcd(b,a%b,y,x),y-=a/b*x; else x=,y=;
return d;
} ll inv(ll t,ll p){ ll x,y; exgcd(t,p,x,y); return (x+p)%p; } ll F(ll n,ll pi,ll pk){
if (!n) return ;
ll ans=;
rep(i,,pk) if (i%pi) ans=ans*i%pk;
ans=ksm(ans,n/pk,pk);
rep(i,,n%pk) if (i%pi) ans=ans*i%pk;
return ans*F(n/pi,pi,pk)%pk;
} ll exlucas(ll n,ll m,ll pi,ll pk){
if (m>n) return ;
ll a=F(n,pi,pk),b=F(m,pi,pk),c=F(n-m,pi,pk);
ll k=;
for (ll i=n; i; i/=pi) k+=i/pi;
for (ll i=m; i; i/=pi) k-=i/pi;
for (ll i=n-m; i; i/=pi) k-=i/pi;
return a*inv(b,pk)%pk*inv(c,pk)%pk*ksm(pi,k,pk)%pk;
} ll CRT(ll n,ll r[],ll m[]){
ll M=,res=,w;
rep(i,,n) M*=m[i];
rep(i,,n) w=M/m[i],res=(res+w*inv(w,m[i])*r[i])%M;
return (res+M)%M;
} ll par(ll n,ll m[],ll st[]){
ll num=;
for (ll i=; i*i<=n; i++) if (n%i==){
ll pk=;
while (n%i==) pk*=i,n/=i;
m[++num]=pk; st[num]=i;
}
if (n>) m[++num]=n,st[num]=n;
return num;
} ll excomb(ll n,ll m){
rep(i,,num) r[i]=exlucas(n,m,st[i],Mod[i]);
return CRT(num,r,Mod);
} int main(){
freopen("bzoj2142.in","r",stdin);
freopen("bzoj2142.out","w",stdout);
scanf("%lld\n",&mod); scanf("%lld%lld",&n,&m);
ll sum=; rep(i,,m) scanf("%lld",&w[i]),sum+=w[i];
if (n<sum){ puts("Impossible"); return ; }
num=par(mod,Mod,st); ans=;
rep(i,,m) n-=w[i-],ans=ans*excomb(n,w[i])%mod;
printf("%lld\n",ans);
return ;
}

[BZOJ2142]礼物(扩展Lucas)的更多相关文章

  1. [bzoj2142]礼物(扩展lucas定理+中国剩余定理)

    题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod  = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...

  2. BZOJ2142 礼物 扩展lucas 快速幂 数论

    原文链接http://www.cnblogs.com/zhouzhendong/p/8110015.html 题目传送门 - BZOJ2142 题意概括 小E购买了n件礼物,送给m个人,送给第i个人礼 ...

  3. BZOJ.2142.礼物(扩展Lucas)

    题目链接 答案就是C(n,m1) * C(n-m1,m2) * C(n-m1-m2,m3)...(mod p) 使用扩展Lucas求解. 一个很简单的优化就是把pi,pi^ki次方存下来,因为每次分解 ...

  4. BZOJ - 2142 礼物 (扩展Lucas定理)

    扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正) 原理: https://blog.csdn.net/hqddm1253679098/article/details ...

  5. bzoj 2142 礼物——扩展lucas模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 没给P的范围,但说 pi ^ ci<=1e5,一看就是扩展lucas. 学习材料 ...

  6. BZOJ2142礼物——扩展卢卡斯

    题目描述 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼 ...

  7. bzoj2142 礼物——扩展卢卡斯定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 前几天学了扩展卢卡斯定理,今天来磕模板! 这道题式子挺好推的(连我都自己推出来了) , ...

  8. BZOJ2142 礼物 【扩展Lucas】

    题目 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼物, ...

  9. BZOJ_2142_礼物_扩展lucas+组合数取模+CRT

    BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...

随机推荐

  1. Python学习1,代码

      看了好久的网上视频,今天尝试着写了一串代码: _author_ = "Happyboy" produce_list = [ ('Iphone',5800), ('Mac Pro ...

  2. 板载raid 安装Ubuntu 黑屏

    最近有碰到过产线反馈supermicro x10主板板载raid安装ubuntu桌面版 ,出现安装完成后黑屏,现象是能正常识别faker raid 但是第一次重启,就会出现黑屏,只有左上角广光标在闪, ...

  3. super和final关键字

    一.super关键字 super关键字的使用 JAVA类中使用super来引用父类的属性或者方法,用this来引用当前对象,主要用法: 1.子类的构造函数默认第一行会默认调用父类的无参数构造函数 2. ...

  4. CyclicBarrier和CountDownLatch的使用

    CyclicBarrier: api对CyclicBarrier的描述: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大 ...

  5. hadoop2.5.2学习及实践笔记(一)—— 伪分布式学习环境搭建

    软件 工具:vmware 10 系统:centOS 6.5  64位 Apache Hadoop: 2.5.2  64位 Jdk:  1.7.0_75  64位 安装规划 /opt/softwares ...

  6. J2EE的十三个技术——JSP

    简介 JSP,Java Server  Page,Java服务器页面.它是在传统的网页HTML文件中插入Java程序段(Scriptlet)和JSP标记,从而形成JSP文件,后缀名为(*.jsp). ...

  7. Nginx主要模块常用指令说明

    核心模块(Core Modules): 主模块(Main Module):配置和服务器全局有关的一些参数,比如错误日志.进程.权限等 user worker_processes error_logsy ...

  8. [AtCoder AGC27A]Candy Distribution Again

    题目大意:把$x$个糖果分给$n$个人,必须分完,如果第$i$个人拿到$a_i$个糖果,就会开心,输出最多多少人开心 题解:从小到大排序,判断是否可以让他开心,注意最后判断是否要少一个人(没分完) 卡 ...

  9. BZOJ 1901: Zju2112 Dynamic Rankings | 带修改主席树

    题目: emmmm是个权限题 题解: 带修改主席树的板子题,核心思想是用树状数组维护动态前缀和的性质来支持修改 修改的时候修改类似树状数组一样进行logn个Insert 查询的时候同理,树状数组的方法 ...

  10. Python之多线程:Threading模块

    1.Threading模块提供的类 Thread,Lock,Rlock,Condition,Semaphore,Event,Timer,local 2.threading模块提供的常用的方法 (1)t ...