BZOJ 2142: 礼物
模非素数下的排列组合,简直凶残
调着调着就过了= =
都不知道怎么过的= =
直接上链接http://hi.baidu.com/aekdycoin/blog/item/147620832b567eb40df4d258.html
CODE:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll a[3][50],pri[50],M[50],t[50];
ll ex_gcd(ll a,ll b,ll &x,ll &y) {
if (b==0) {x=1,y=0 ;return a;}
ex_gcd(b,a%b,x,y);
x=x-a/b*y;
swap(x,y);
return 0;
}
ll p;
int l,sum[50];
int fen(int p){
for (int i=2;i<=sqrt(p);i++) {
if (p%i==0) {
pri[++l]=i;
while (p%i==0) {
sum[l]++;
p/=i;
}
}
}
if (p>1) {pri[++l]=p;sum[l]=1;}
return 0;
}
ll power(ll x,ll y,ll mod){
if (y==0) return 1;
ll ans=power(x,y>>1,mod);
ans=ans*ans%mod;
if (y&1) ans=ans*x%mod;
return ans;
}
ll f[100101],cnt;
ll calcfac(ll n,ll p,ll pi){
if (n<pi) return f[n];
// printf("%lld %lld",pi,pri[1]);
ll seg=n/p,rem=n%p;
ll ret=power(f[p-1],seg,p);
ret=ret*f[rem]%p;
cnt+=n/pi;
ret=ret*calcfac(n/pi,p,pi)%p;
return ret;
}
ll china(ll *a,ll *b) {
ll tem,ans=0;
for (int i=2;i<=l;i++) {
ll x,y;
ex_gcd(b[i-1],b[i],x,y);
b[i]=b[i]*b[i-1];
a[i]=((x*(a[i]-a[i-1])*b[i-1]+a[i-1])%b[i]+b[i])%b[i];
}
return a[l];
}
ll b[51];
ll c(int n,int m){
for (int i=1;i<=l;i++) {
ll p=1;
for (int j=1;j<=sum[i];j++) p*=pri[i];
f[0]=1;
for (int j=1;j<p;j++) {
f[j]=f[j-1];
if (j%pri[i]==0) continue;
f[j]=(f[j]*j)%p;
}
cnt=0;ll ans,tem;
a[1][i]=calcfac(n,p,pri[i]);
tem=cnt;cnt=0;
a[2][i]=calcfac(m,p,pri[i]);
printf("%lld\n",pri[1]);
a[3][i]=calcfac(n-m,p,pri[i]);
cnt=tem-cnt;
a[2][i]=a[3][i]*a[2][i]%p;
ex_gcd(a[2][i],p,ans,tem);
ans=(ans%p+p)%p;
a[1][i]=a[1][i]*ans%p*power(pri[i],cnt,p)%p;
b[i]=p;
}
return (china(a[1],b));
}
ll te[8];
int main(){
ll n,m;
ll tmp=0;
scanf("%lld %lld %lld",&p,&n,&m);
for (int i=1;i<=m;i++) {
scanf("%lld",&te[i]);
tmp+=te[i];
}
if (tmp>n) {printf("Impossible");return 0;}
fen(p);
for (int i=1;i<=l;i++) printf("%lld %lld\n",pri[i],sum[i]);
ll ans=1;
for (int i=1;i<=m;i++) {
ans=ans*c(n,te[i])%p;
n-=te[i];
// if (ans==0) {printf("%d\n",0);return 0;}
printf("\n\n");
}
printf("%lld",ans);
return 0;
}
BZOJ 2142: 礼物的更多相关文章
- BZOJ 2142: 礼物 [Lucas定理]
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1294 Solved: 534[Submit][Status][Discuss] ...
- BZOJ 2142 礼物 组合数学 CRT 中国剩余定理
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1450 Solved: 593[Submit][Status][Discuss] ...
- 【刷题】BZOJ 2142 礼物
Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店 ...
- bzoj 2142 礼物——扩展lucas模板
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 没给P的范围,但说 pi ^ ci<=1e5,一看就是扩展lucas. 学习材料 ...
- bzoj 2142: 礼物【中国剩余定理+组合数学】
参考:http://blog.csdn.net/wzq_qwq/article/details/46709471 首先推组合数,设sum为每个人礼物数的和,那么答案为 \[ ( C_{n}^{sum} ...
- BZOJ.2142.礼物(扩展Lucas)
题目链接 答案就是C(n,m1) * C(n-m1,m2) * C(n-m1-m2,m3)...(mod p) 使用扩展Lucas求解. 一个很简单的优化就是把pi,pi^ki次方存下来,因为每次分解 ...
- BZOJ - 2142 礼物 (扩展Lucas定理)
扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正) 原理: https://blog.csdn.net/hqddm1253679098/article/details ...
- BZOJ 2142 礼物 数论
这道题是求组合数终极版. C(n,m) mod P n>=1e9 m>=1e9 P>=1e9且为合数且piqi<=1e5 拓展lucas定理. 实际上就是一点数论小知识的应用. ...
- bzoj 3055礼物运送 floyed + 状压DP
bzoj 3055: 礼物运送 floyed first 设f[i][S]表示取到了S集合中的所有点(不一定是经过的所有点),最后停在了i的最优值. 初始就f[i][{i}] = dis[1][i] ...
随机推荐
- php连接mysql数据库(新浪云SAE)
新浪云提供了免费的创建服务器端应用的服务.网址为:https://www.sinacloud.com/ 在上面创建好应用,然后在本地使用记事本编写应用的代码如下: <?php echo &quo ...
- CastleWindsor 使用说明
1.引用DLL Castle.Core.dll 和Castle.Windsor.dll 2. 引用命名空间 using Castle.MicroKernel.Resolvers.Specialize ...
- Leetcode 175. Combine Two Tables
Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...
- iOS 之 设置控件在视图中心位置
_qrImgView.bounds = CGRectMake(0, 0, sizeImg, sizeImg); _qrImgView.center = CGPointMake(CGRectGetWid ...
- javaEE开发中使用session同步和token机制来防止并发重复提交
javaEE开发中使用session同步和token机制来防止并发重复提交 通常在普通的操作当中,我们不需要处理重复提交的,而且有很多方法来防止重复提交.比如在登陆过程中,通过使用redirect,可 ...
- CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14方法分享
一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop fi ...
- Struts2文件的上传
一.单文件的上传 表单的enctype属性: application/x-www-form-urlencoded:默认的编码方式. multipart/form-data:会以二进制的方式处理表单数 ...
- python 循环使用 while 或 for 语句实现用户名密码输错三次退出
如有错误欢迎大家指出,新手初来乍到.程序没那么复杂,是最简单的. 一.需求 编写登录文件 .py1. 输入用户名密码2. 正确,输出欢迎登录3. 当输入用户名和密码小于 3 次,输入用户名或者密码错误 ...
- javascript object-oriented something
http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/ http://www.cnblogs.com/RicCC/archive/2008 ...
- 如何估算网站日承受最大访问PV
每个老板或客户都会问架构师这个问题. 你设计的网站能承受多大的日访问量. 程序员都会拍胸脯说出一个心理最大数字.说的时候很有信心.其实这个数字大多是猜的.作为一个理性的程序员怎么能用猜呢? 这里就介绍 ...