题目链接

戳这

Title Solution

这一道题显然可以看出公式为:

\[ans=C_{n}^{w_1}*C_{n-w}^{w_2}*...*C_{w_m}^{w_m}
\]

然后就可以用扩展Lucas求解了。

至于扩展Lucas:戳这

code

#include<bits/stdc++.h>
#define rg register
#define int long long
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
void exgcd(int a,int b ,int &x,int &y){ if(!b){x=1,y=0;return;}
exgcd(b,a%b,x,y);
int t=x;
x=y,y=t-(a/b)*y;
}
int inv(int a,int b){
int x,y;
return exgcd(a,b,x,y),(x%b+b)%b;
}
int ksm(int a,int b,int p){
int ans=1;
while(b){
if(b&1)
ans=a*ans%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
int crt(int x,int p,int mod){
return inv(p/mod,mod)*(p/mod)*x;
}
int fac(int x,int a,int b){
if(!x)
return 1;
int ans=1;
for(int i=1;i<=b;i++)
if(i%a)
ans*=i,ans%=b;
ans=ksm(ans,x/b,b);
for(int i=1;i<=x%b;i++)
if(i%a)
ans*=i,ans%=b;
return ans*fac(x/a,a,b)%b;
}
int C(int n,int m,int a,int b){
int N=fac(n,a,b),M=fac(m,a,b),Z=fac(n-m,a,b),sum=0;
for(int i=n;i;i=i/a)
sum+=i/a;
for(int i=m;i;i=i/a)
sum-=i/a;
for(int i=n-m;i;i=i/a)
sum-=i/a;
return N*ksm(a,sum,b)%b*inv(M,b)%b*inv(Z,b)%b;
}
int exlucas(int n,int m,int p){
int t=p,ans=0;
for(int i=2;i*i<=p;i++){
int k=1;
while(t%i==0)
k*=i,t/=i;
ans+=crt(C(n,m,i,k),p,k),ans%=p;
}
if(t>1)
ans+=crt(C(n,m,t,t),p,t),ans%=p;
return ans%p;
}
int a[11];
void slove(){
int p=read(),n=read(),m=read(),sum=0;
for(int i=1;i<=m;i++)
a[i]=read(),sum+=a[i];
if(n<sum)
printf("Impossible\n"),exit(0);
int ans=1;
for(int i=1;i<=m;i++)
ans*=exlucas(n,a[i],p),ans%=p,n-=a[i];
printf("%lld",ans%p);
}
main(){
slove();
return 0;
}

「BZOJ 2142」礼物的更多相关文章

  1. loj#2020 「AHOI / HNOI2017」礼物 ntt

    loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...

  2. 「BZOJ 4228」Tibbar的后花园

    「BZOJ 4228」Tibbar的后花园 Please contact lydsy2012@163.com! 警告 解题思路 可以证明最终的图中所有点的度数都 \(< 3\) ,且不存在环长是 ...

  3. 「BZOJ 3645」小朋友与二叉树

    「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...

  4. 「BZOJ 4502」串

    「BZOJ 4502」串 题目描述 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合 \(S\),然后它们定义一个字符串为"好"的,当且仅当它可以被分成非空的两段,其中每一段 ...

  5. 「BZOJ 4289」 PA2012 Tax

    「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...

  6. 「BZOJ 2534」 L - gap字符串

    「BZOJ 2534」 L - gap字符串 题目描述 有一种形如 \(uv u\) 形式的字符串,其中 \(u\) 是非空字符串,且 \(v\) 的长度正好为 \(L\), 那么称这个字符串为 \( ...

  7. 「AHOI / HNOI2017」礼物

    「AHOI / HNOI2017」礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰 ...

  8. 「BZOJ 2956」模积和

    「BZOJ 2956」模积和 令 \(l=\min(n,m)\).这个 \(i\neq j\) 非常不优雅,所以我们考虑分开计算,即: \[\begin{aligned} &\sum_{i=1 ...

  9. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

随机推荐

  1. 实例甜点 Unreal Engine 4迷你教程(2)之用C++改变Image小部件的颜色

    完成本迷你教程之前,请前往完成以下迷你教程: ·实例甜点 Unreal Engine 4迷你教程之如何用C++将纹理绘制在UserWidget的Image小部件上: 目标:实现UMG中的此功能: 在上 ...

  2. python开发mysql:Pymysql模块

    pymysql模块的使用 #1 基本使用 # import pymysql # conn=pymysql.connect(host='localhost',user='root',password=' ...

  3. C++获取Lua全局变量和执行Lua多参数多返回值函数

    C++代码: // LuaAndC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #i ...

  4. Py修行路 python基础 (二十五)线程与进程

    操作系统是用户和硬件沟通的桥梁 操作系统,位于底层硬件与应用软件之间的一层 工作方式:向下管理硬件,向上提供接口 操作系统进行切换操作: 把CPU的使用权切换给不同的进程. 1.出现IO操作 2.固定 ...

  5. selenium webdriver 的事件处理

    package www.zr.com; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; imp ...

  6. 不使用sudo命令执行docker

    不使用sudo命令执行docker  2015-09-11 11:03:05  王春生  8049 最后编辑:王春生 于 2015-09-11 12:18:30 简介:本篇文章介绍如何不使用sudo命 ...

  7. Apple Ad Hoc

    Apple Ad Hoc 发布测试 App只能通过Ad Hoc分享给绑定我们账号的设备上,所以至是一百台 1.官网member Center创建Ad Hoc证书 2.在官网下载Ad Hoc证书到mac ...

  8. pl/sql的to_char和to_date

    今天同事让笔者将sql查询出来的时间转换为指定格式的字符串,笔者当时懵逼了,印象中记得有处理过,但就是一时想不起来了,等处理了这个问题后,笔者觉得有必要记录一下,毕竟不知道这个是很掉面子的事不是?好了 ...

  9. java之yield(),sleep(),wait()区别详解-备忘笔记(转)

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  10. oracle job SYSDATE

    hr BEGIN SYS.DBMS_JOB.REMOVE(); COMMIT; END; / DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job =&g ...