HDU 5446
题意: 大组合数取余 (素数连乘)
思路:
对于答案 X
X % pi = ai === C(m,n) % pi;
然后就是用孙子定理求出X, ai 用 卢卡斯定理求得
中间 LL * LL 会爆, 运用按位乘法
对于 m * n % K, 把 m 看成 二进制形式的多项式, 拆开和 n 相乘, 再取余
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 131;
typedef long long LL; LL Pow_Mod(LL a, LL b, LL p)
{
LL ret = 1;
while(b)
{
if(b & 1) ret = (ret * a) % p;
a = a * a % p;
b >>= 1;
}
return ret;
} void Exgcd(LL a, LL b, LL& d, LL& x, LL& y)
{
if(b == 0) { d = a, x = 1, y = 0; }
else { Exgcd(b,a%b,d,y,x); y -= x * (a / b); }
}
///////////////////////////// Lucas
LL Fac[maxn], Inv[maxn]; void Init(LL n)
{
Fac[0] = 1;
for(LL i = 1; i < n; ++i) Fac[i] = Fac[i-1] * i % n;
Inv[n-1] = Pow_Mod(Fac[n-1], n-2, n);
for(LL i = n-2; i >= 0; --i) Inv[i] = Inv[i+1] * (i + 1) % n;
} LL C(LL m, LL n, LL p)
{
if(n > m || m < 0 || n < 0) return 0;
return (Fac[m] * Inv[n]) % p * Inv[m-n] % p;
} LL Lucas(LL m, LL n, LL p)
{
if(n == 0) return 1;
return Lucas(m/p, n/p, p) * C(m%p, n%p, p) % p;
}
//////////////////////////////////
LL Ai[maxn], Pi[maxn]; LL mul(LL a, LL b, LL p)
{
a = (a % p + p) % p;
b = (b % p + p) % p;
LL ret = 0;
while(b)
{
if(b & 1) ret = (ret + a) % p;
b >>= 1;
a <<= 1;
a %= p;
}
return ret;
} LL China(int n, LL *a, LL *m)
{
LL x, y, d, M = 1;
LL ret = 0;
for(int i = 1; i <= n; ++i) M = M * m[i];
for(int i = 1; i <= n; ++i)
{
LL w = M / m[i];
//y = Pow_Mod(w, m[i]-2, m[i]); WA
Exgcd(m[i],w,d,d,y) ;
ret = (ret + mul(a[i], mul(y, w, M), M)) % M;
}
return ret;
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
LL m, n; int k;
scanf("%lld%lld%d", &m, &n, &k);
for(int i = 1; i <= k; ++i)
{
scanf("%llu",&Pi[i]);
Init(Pi[i]);
Ai[i] = Lucas(m,n,Pi[i]);
}
LL ans = China(k,Ai,Pi);
printf("%lld\n",ans);
}
}
HDU 5446的更多相关文章
- 中国剩余定理&Lucas定理&按位与——hdu 5446
链接: hdu 5446 http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意: 给你三个数$n, m, k$ 第二行是$k$个数,$p_1,p_2,p_ ...
- 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 Lucas+中国剩余定理+按位乘
HDU 5446 Unknown Treasure 题意:求C(n, m) %(p[1] * p[2] ··· p[k]) 0< n,m < 1018 思路:这题基本上算是模版题了 ...
- 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定理+CRT)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5446 [题目大意] 给出一个合数M的每一个质因子,同时给出n,m,求C(n,m)%M. [题解] ...
- hdu 5446 lucas+crt+按位乘
http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意:题目意思很简单,要你求C(n,m)mod p的值 p=p1*p2*...pn; 题解:对于C(n,m ...
- HDU 5446 Unknown Treasure(lucas + 中国剩余定理 + 模拟乘法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 题目大意:求C(n, m) % M, 其中M为不同素数的乘积,即M=p1*p2*...*pk, ...
- HDU 5446 中国剩余定理+lucas
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- hdu 5446 Unknown Treasure Lucas定理+中国剩余定理
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
随机推荐
- Centos7安装官方JDK
一.下载jdk最新版本版本 链接地址:官方地址 二.上传jdk到centos下 三.检查当前linux系统上是否有jdk,linux命令:rpm -qa | grep java 查询结果: 卸载掉系统 ...
- Spark源码剖析 - SparkContext的初始化(十)_Spark环境更新
12. Spark环境更新 在SparkContext的初始化过程中,可能对其环境造成影响,所以需要更新环境,代码如下: SparkContext初始化过程中,如果设置了spark.jars属性,sp ...
- Set接口HashSet实现类
java.util.Set接口 extends Collection接口 Set特点: 1.不允许有重复的元素 2.没有索引,没有带索引的方法,也不能使用普通的for遍历 java.util.Hash ...
- ArcGIS坐标系转换出错:Error 999999执行函数出错 invalid extent for output coordinate system
本文主要介绍在用ArcGIS做坐标系转换过程中可能会遇到的一个问题,并分析其原因和解决方案. 如下图,对一份数据做坐标系转换: 过了一会儿,转换失败了.错误消息如下: “消息”中提示,“执行函数出错 ...
- linux上安装mysql,tomcat,jdk
Linux 上安装 1 安装jdk 检测是否安装了jdk 运行 java –version 若有 需要将其卸载 a) 查看安装哪些jdk rmp –qa |grep java b) ...
- asp.net上传图片,上传图片
想必很多人工作中经常需要实现上传图片的功能. 先引用此插件 http://files.cnblogs.com/files/hmYao/jquery-form.js. 前台代码 <form dat ...
- 修改教材P74 一行代码 NineNineTable.java, 让执行结果是个三角形
修改教材P74 一行代码 NineNineTable.java, 让执行结果是个三角形: 提交在IDEA或命令行中运行结查截图,加上学号水印,没学号的不给成绩 2*9=18 3*9=27 4*9=36 ...
- ubuntu安装matlab
https://blog.csdn.net/qq_36982160/article/details/78397514 https://blog.csdn.net/weixin_40294256/art ...
- 嵌入式开发 迅为4418开发板Qt移植移动4G模块第一部分
本文转自迅为论坛:http://topeetboard.com 了解更多:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-7744162139 ...
- Linux/Windows双系统引导修复
安装双系统建议先安装windows,然后在安装Linux,使用Linux(grub2)引导双系统 如果重新安装了windows,则无法引导进入linux,需要修复引导 在windows下安装easyB ...