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 ...
随机推荐
- 如何设置虚拟化的centos内、外网络通畅
首先要去确定你的本机(本地物理机)是通过以太网(插网线)上网的,还是通过wifi上网的.这个很重要. 如果是通过以太网去上网,那么虚拟化出来的系统,网络配置应当选择桥接模式. 当然了,也不一定非要用桥 ...
- 仿京东淘宝商品详情页属性选择js效果
在网上找了好久发现都不符合要求就自己摸索写了一个,用到了linq.js这个linq to js 扩展,不然用纯JS遍历json查询要死人啊 demo:http://123.207.28.46:8086 ...
- selenium,unittest——两个class连续运行
将多个class放在一个文件内一起运行,这是一个多用例不同网站进行测试的方法 #encoding=utf-8from selenium import webdriverimport time,unit ...
- List和Turple
List 格式:classmates = ['Michael', 'Bob', 'Tracy'] 读取list长度用:len(classmetes) 索引:索引正向从0开始,逆向从-1开始 在末尾增加 ...
- 互联网行业求职课-教你进入BAT
互联网行业求职课--教你进入BAT 课时1. 课程内容介绍.导师介绍.服务安排和介绍等 课时2. 互联网行业.职业选择指导 互联网公司选择: 大公司:收获:大平台,系统思维,系统培训,系统性的发展,薪 ...
- JVM--Java类加载机制
一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其存放在运行时数据区的方法区内,然后在java堆区创建一个java.lang.Class对象,用来封装类在方法区内 ...
- leetcode-帕斯卡三角形
帕斯卡三角形 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 示例: 输入: 5 输出: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4 ...
- 下拉网页div自动浮在顶部
<!DOCTYPE html> <html> <head> <title></title> <style type="tex ...
- [Clr via C#读书笔记]Cp2生成打包部署和管理应用程序和类型
Cp2生成打包部署和管理应用程序和类型 部署问题 DLL Hell;安装的复杂性:安全性:代码访问安全性. csc.exe的简单使用. 元数据 定义表:引用表:清单表: 程序集 重用,版本控制,安全的 ...
- Python入门(3)
一.列表 列表是用来储存和处理多个数据的数据类型,我们可以像下面这样来创建一个列表: my_list = [1, 2, 3] 列表和数学中的集合很像,但是,列表中的数据是可以重复,并且他们是有序的,列 ...