BZOJ2142: 礼物(拓展lucas)
Description
Input
Output
若不存在可行方案,则输出“Impossible”,否则输出一个整数,表示模P后的方案数。
Sample Input
4 2
1
2
Sample Output
解题思路:
这道题就是组合数取模终极版。
很显然要求的就是:

数据范围好像不是很大。
拓展lucas没跑了。
大概思路就是:先将取模数拆分,求出各部分的解,使用中国剩余定理合并答案。
中国剩余定理我就不说了。
这里主要讲一下拓展lucas。
将组合数展开:

这里主要有两个问题需要解决
1.n 太大,一锅煮不下,直接枚举会超时。
2.n 比取模数大时会变成0下面本来有抵消的都没了。
我们一个一个看。
怎么计算n!呢?
我们暴力吧。
我们先看第二个吧。
先说第二个。
既然是抵消了,那么为何不让它先约掉呢。
很显然,将最小质因数p的幂次项提取出就可以完成任务。
也就是说,在处理阶乘时,跳过幂次项。
就是将原式化简成这样:

就解决了。
回来看第一个。
既然要跳过p的次幂,那么就都提出来发现剩余项是前pk以内的数的次幂。
提出来的项可以递归操作。
差不多就是这样了。
我也不知道这和lucas有啥关系
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
lnt prime[];
lnt picie[];
lnt tmp[];
lnt w[];
lnt n,m;
int cnt;
lnt qucp(lnt a,lnt b,lnt c)
{
lnt ans=;
while(b)
{
if(b&)
ans=ans*a%c;
a=a*a%c;
b=b/;
}
return ans%c;
}
void exgcd(lnt a,lnt b,lnt &x,lnt &y)
{
if(!b)
{
x=;
y=;
return ;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
return ;
}
lnt Inv(lnt x,lnt mod)
{
lnt a;
lnt b;
exgcd(x,mod,a,b);
return (a%mod+mod)%mod;
}
lnt Crt(lnt num,lnt *ans,lnt *mod)
{
lnt ret=;
lnt mdl=;
for(int i=;i<=num;i++)
mdl*=mod[i];
for(int i=;i<=num;i++)
{
lnt x=mdl/mod[i];
ret=(ret+x*Inv(x,mod[i])%mdl*ans[i]%mdl)%mdl;
}
return ret;
}
lnt fac(lnt len,lnt pi,lnt pk)
{
if(!len)
return ;
lnt ans=;
for(int i=;i<=pk;i++)
if(i%pi)
ans=ans*i%pk;
ans=qucp(ans,len/pk,pk);
for(int i=;i<=len%pk;i++)
if(i%pi)
ans=ans*i%pk;
return ans*fac(len/pi,pi,pk)%pk;
}
lnt Exlucas(lnt n,lnt m,lnt plc)
{
if(m>n)
return ;
lnt fan=fac(n,prime[plc],picie[plc]);
lnt fam=fac(m,prime[plc],picie[plc]);
lnt fad=fac(n-m,prime[plc],picie[plc]);
lnt ans=fan*Inv(fam,picie[plc])%picie[plc]*Inv(fad,picie[plc])%picie[plc];
lnt c=;
for(int i=n;i;i/=prime[plc])
c+=i/prime[plc];
for(int i=m;i;i/=prime[plc])
c-=i/prime[plc];
for(int i=n-m;i;i/=prime[plc])
c-=i/prime[plc];
return ans*qucp(prime[plc],c,picie[plc])%picie[plc];
}
void brkdn(lnt P)
{
for(int i=;i*i<=P;i++)
{
if(P%i==)
{
cnt++;
prime[cnt]=i;
picie[cnt]=;
while(P%i==)
{
picie[cnt]*=(lnt)(i);
P/=i;
}
}
}
if(P!=)
{
cnt++;
picie[cnt]=prime[cnt]=P;
}
return ;
}
int main()
{
lnt Mod;
scanf("%lld",&Mod);
brkdn(Mod);
scanf("%lld%lld",&n,&m);
lnt sum=;
lnt ans=;
for(int i=;i<=m;i++)
{
scanf("%lld",&w[i]);
sum+=w[i];
}
if(sum>n)
{
puts("Impossible");
return ;
}
for(int i=;i<=m;i++)
{
for(int j=;j<=cnt;j++)
tmp[j]=Exlucas(n,w[i],j);
ans=ans*Crt(cnt,tmp,picie)%Mod;
n-=w[i];
}
printf("%lld\n",ans);
return ;
}
BZOJ2142: 礼物(拓展lucas)的更多相关文章
- 【BZOJ-2142】礼物 拓展Lucas定理
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1313 Solved: 541[Submit][Status][Discuss] ...
- [BZOJ2142]礼物(扩展Lucas)
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2286 Solved: 1009[Submit][Status][Discuss] ...
- BZOJ2142 礼物 扩展lucas 快速幂 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8110015.html 题目传送门 - BZOJ2142 题意概括 小E购买了n件礼物,送给m个人,送给第i个人礼 ...
- [bzoj2142]礼物(扩展lucas定理+中国剩余定理)
题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...
- 【bzoj2142】【礼物】拓展Lucas定理+孙子定理
(上不了p站我要死了,侵权度娘背锅) Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量 ...
- 数学:拓展Lucas定理
拓展Lucas定理解决大组合数取模并且模数为任意数的情况 大概的思路是把模数用唯一分解定理拆开之后然后去做 然后要解决的一个子问题是求模质数的k次方 将分母部分转化成逆元再去做就好了 这里贴一份别人的 ...
- 【拓展Lucas】模板
求\(C_n^m \mod p\),写得太丑了qwq. 第一次写拓展Lucas竟然是在胡策的时候qwq写了两个半小时啊_(:з」∠)还写挂了一个地方qwq 当然今天胡策我也是第一次写中国剩余定理(ˇˍ ...
- 拓展Lucas小结
拓展Lucas是解决大组合数取模非质数(尤其是含平方因子的合数)问题的有力工具... 首先对模数质因数分解,把每个质因子单独拎出来处理答案,然后用中国剩余定理(excrt)合并 问题转化为,对于每个质 ...
- BZOJ 3129 [SDOI2013]方程 (拓展Lucas)
题目大意:给定一个方程$X_{1}+X_{2}+X_{3}+X_{4}+...+X_{n}=M$,$\forall X_{i}<=A_{i} (i<=n1)$ $\forall X_{i} ...
随机推荐
- vue14 自定义过滤器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- libsvm 的使用
1. libsvm 支持的SVM模型 官网地址:LIBSVM – A Library for Support Vector Machines libsvm 支持的 SVM 模型如下(C:classif ...
- 9.ng-options
转自:https://www.cnblogs.com/best/tag/Angular/ 该指令允许你基于一个迭代表达式添加选项 <select ng-model="color&quo ...
- jquery ajax中支持哪些返回类型以及js中判断一个类型常用的方法?
1 jquery ajax中支持哪些返回类型在JQuery中,AJAX有三种实现方式:$.ajax() , $.post , $.get(). 预期服务器返回的数据类型.如果不指定,jQuery 将自 ...
- Hue的三大特点、三大功能和架构
不多说,直接上干货! Hue 是 Cloudera 的大数据 Web 工具 官方访问网站 : http://gethue.com/ GitHub : https://github.com/cloude ...
- Cisco交换机解决网络蠕虫病毒入侵问题
Cisco交换机解决网络蠕虫病毒入侵问题 今年来网络蠕虫泛滥给ISP和企业都造成了巨大损失,截至目前已发现近百万种病毒及木马.受感染的网络基础设施遭到破坏,以Sql Slammer为 ...
- centos中mysql 安装以及配置,建库
1.检测系统内部有没有安装其他的mysql数据库 rpm -qa | grep mysql 然后如果有的话删除这些mysql yum remove 查出来的所有名字 2.彻底删除系统中mysql的目录 ...
- js中split,splice,slice方法之间的差异。
首先我们先来林格斯双击翻译一下: split 劈开, 使分裂: splice 接合; 使结合: slice 切成薄片, 切: 我先是这么区分的:这三个方法最后一个字母是t的是字符串方法,是e的 ...
- cogs 1430. [UVa 11300]分金币
1430. [UVa 11300]分金币 ★☆ 输入文件:Wealth.in 输出文件:Wealth.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 圆桌旁坐着 ...
- C - The C Answer (2nd Edition) - Exercise 1-4
/* Write a program to print the corresponding Celsius to Fahrenheit table. */ #include <stdio.h&g ...