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 ...
随机推荐
- 队列 Queue 与 生产者消费模型
队列:先进先出 # from multiprocessing import Queue # Q = Queue(4) # Q.put('a') # Q.put('b') # Q.put('b') # ...
- jsp使用cookie自动登录
Login.jsp <%@ page language="java" import="java.util.*" pageEncoding="ut ...
- docker 系列 - Java程序制作Docker Image推荐方案(转载)
本文转自 https://segmentfault.com/a/1190000016449865 , 感谢作者! 本文的源代码在:https://github.com/chanjarste... 这 ...
- SQL Server进阶(四):联接-cross join、inner join、left join、right jion、union、union all
测试数据脚本 CREATE TABLE Atable ( S# INT, Sname ), Sage INT, Sfrom ) ) insert into Atable ,N,N'A' union a ...
- 唯一约束(UNIQUE_KEY)
唯一约束可以保证记录的唯一性 唯一约束的字段可以为空值(NULL) 每张数据表可以存在多个唯一约束(主键只有一个) mysql> CREATE TABLE tb7( -> id SMALL ...
- Javascript面向对象特性实现封装、继承、接口详细案例
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- Debian Security Advisory(Debian安全报告) DSA-4404-1 chromium
Package : chromium CVE ID : CVE-2019-5786 Clement Lecigne在chromium的文件读取器实现中发现了一个use-after-free(释放后重用 ...
- Kali Linux之web安全扫描器skipfish使用
0x00.skipfish简介 谷歌公司出品的开源web程序评估软件. skipfish特点:CPU资源占用低,扫描速度快,每秒可以轻松处理2000个请求,误报率低. 1x00.skipfish使用 ...
- python-类型转化
s='1234' a=int(s) 字符串转换成整数 s=str(a) 整数转换成字符串
- cpp #,##
#define语句中的#是把参数字符串化,##是连接两个参数成为一个整体. #define FACTORY_REF(name) { #name, Make##name } 中#name就是将传入的na ...