HDU5446:Unknown Treasure——题解
http://acm.hdu.edu.cn/showproblem.php?pid=5446
求C(n,m)%(p1p2…pk)的值,其中pi均为质数。
参考:https://www.cnblogs.com/linyujun/p/5199684.html
预备知识:
1.Lucas定理(图片来自百科):当p为素数时,有

2.中国剩余定理:

3.求逆元。
根据中国剩余定理可知,我们求C(n,m)%(p1p2…pk),实际就是在求解同余方程组:
C(n,m)%p1=a1
C(n,m)%p2=a2
……
C(n,m)%p3=a3
最终求得的C(n,m)即是在%(p1p2…pk)意义下的。
根据lucas定理,我们能立刻求出所有a的值。
在那之后用中国剩余定理求解即可。
(另外如果逆元不存在的话我就不知道怎么做了emmm……不过看数据貌似避开了这个问题)
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll qpow(ll k,ll n,ll p){
ll ans=;
while(n){
if(n&)ans=ans*k%p;
k=k*k%p;n>>=;
}
return ans;
}
ll mul(ll a,ll b,ll p){
ll ans=;
while(b){
if(b&)ans=(ans+a)%p;
a=(a<<)%p;b>>=;
}
return ans;
}
ll C(ll n,ll m,ll p){
if(n<m)return ;
if(n==m)return ;
if(m>n-m)m=n-m;
ll cn=,cm=;
for(ll i=;i<m;i++){
cn=cn*(n-i)%p;
cm=cm*(m-i)%p;
}
return cn*qpow(cm%p,p-,p)%p;
}
ll lucas(ll n,ll m,ll p){
ll ans=;
while(n&&m&&ans){
ans=ans*C(n%p,m%p,p)%p;
n/=p;m/=p;
}
return ans;
}
int t;
ll n,m,k,p[],r[],P;
int main(){
cin>>t;
while(t--){
cin>>n>>m>>k;P=;
for(int i=;i<=k;i++){
cin>>p[i];P*=p[i];
r[i]=lucas(n,m,p[i]);
}
ll ans=;
for(int i=;i<=k;i++){
ll w=P/p[i],inv=qpow(w%p[i],p[i]-,p[i]);
ans=(ans+mul(w*inv,r[i],P))%P;
}
printf("%lld\n",ans);
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
HDU5446:Unknown Treasure——题解的更多相关文章
- HDU5446 Unknown Treasure(组合数膜合数-->Lucas+中国剩余定理)
>On the way to the next secret treasure hiding place, the mathematician discovered a cave unknown ...
- Unknown Treasure(hdu5446)
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- HDU 5446 Unknown Treasure Lucas+中国剩余定理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 Unknown Treasure 问题描述 On the way to the next se ...
- hdu 5446 Unknown Treasure lucas和CRT
Unknown Treasure Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- hdu 5446 Unknown Treasure Lucas定理+中国剩余定理
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- hdu 5446 Unknown Treasure 卢卡斯+中国剩余定理
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- Unknown Treasure (卢卡斯 + 孙子定理, 模板题)
Unknown Treasure 参考链接 : https://www.cnblogs.com/linyujun/p/5199684.html 卢卡斯定理 : C(n, m) % p = C(n ...
- Hdu 5446 Unknown Treasure (2015 ACM/ICPC Asia Regional Changchun Online Lucas定理 + 中国剩余定理)
题目链接: Hdu 5446 Unknown Treasure 题目描述: 就是有n个苹果,要选出来m个,问有多少种选法?还有k个素数,p1,p2,p3,...pk,结果对lcm(p1,p2,p3.. ...
- HDU 5446 Unknown Treasure
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
随机推荐
- hdu1175连连看(dfs+细节)
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- APP性能测试工具-GT(随身调)
GT(随身调)是APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug Environment).利用GT,仅凭一部手机,无需连接电脑,您即可对AP ...
- jmeter基础之录制篇
一.前言 jmeter如今被越来越多人喜爱的一款测试工具,相比于loadrunner它体积特轻便.jmeter不仅用来做单接口测试,压测还能做性能,主要是一款开源的,可以写一个你需要的插件功能再添加里 ...
- java基础-Comparator接口与Collections实现排序算法
java 排序Comparable和Comparator使用 java提供了两个排序用的接口Comparable和Comparator,一般情况下使用区别如下: Comparable 接口用于类的固定 ...
- Java 单例模式探讨
以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...
- ViewPager的简单使用说明
前提:工程中使用ViewPager,需要导入google提供的jar包(android-support-v4.jar). 要学习ViewPager的使用,建议直接看官方文档 Creating Swip ...
- Python的实现分类
目前流行的Python实现包括CPython,Jython,IronPython,Stackless,PyPy,Cython,Shed Skin. CPython Cpython是Python的标准实 ...
- python切片详解
先从原理上分析切片运算: list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数.而slice函数又是和range()函数相关的. 给切片传递 ...
- eg_4
4. 编写一个程序,要求以树状结构展现特定的文件夹及其子文件(夹) import java.io.*; public class Test { public static void main(Stri ...
- 用SC命令 添加或删除windows服务提示OpenSCManager 失败5 拒绝访问
在安装命令行中安装 windowsOpenSCManager 失败5 的错误,原因是当前用户的权限不足,需要做的是在注册表 HKEY_LOCAL_MACHINE\Software\Microsof ...