中国剩余定理&Lucas定理&按位与——hdu 5446
链接:
hdu 5446
http://acm.hdu.edu.cn/showproblem.php?pid=5446
题意:
给你三个数$n, m, k$
第二行是$k$个数,$p_1,p_2,p_3 \cdots p_k$
所有$p$的值不相同且p都是质数
求$C(n, m) \ \%\ (p_1*p_2*p_3* \cdots *p_k)$的值
范围:$1\leq m\leq n\leq 1e18,\ 1\leq k\leq 10,p_i\leq 1e5$,保证$p_1*p_2*p_3* \cdots *p_k \leq 1e18$
分析:
我们知道题目要求$C(n, m) \ \% \ (p_1*p_2*p_3* \cdots *p_k)$的值
其实这个就是中国剩余定理最后算出结果后的最后一步求余
那$C(n, m)$相当于以前我们需要用中国剩余定理求的值
然而$C(n, m)$太大,我们只好先算出$C(n,m) \ \% \ p_1 = r_1 \\ C(n,m) \ \% \ p_2 = r_2 \\ C(n,m) \ \% \ ; p_3 = r_3 \\ \vdots \\ C(n,m) \ \% \ p_k = r_k \\$
用$Lucas$,这些$r_1,r_2,r_3 \cdots r_k$可以算出来,然后又是用中国剩余定理求答案。
注意,有些地方直接乘会爆long long,按位乘可避免。
AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;; typedef long long LL; void gcd(LL a, LL b, LL &d, LL &x, LL &y)
{
if (!b) { d = a; x = ; y = ; }
else { gcd(b, a % b, d, y, x); y -= x * (a / b); }
} LL quickmul(LL m, LL n, LL k)
{
m = (m % k + k) % k; n = (n % k + k) % k; //变成较小的正数
LL res = ;
while (n > )
{
if (n & )
res = (res + m) % k;
m = (m + m) % k;
n = n >> ;
}
return res;
} //计算模n下a的逆。如果不存在逆,返回-1
//ax=1(mod n)
LL inv(LL a, LL n)
{
LL d, x, y;
gcd(a, n, d, x, y);
return d == ? (x + n) % n : -;
} //n! % p
LL fact(LL n, LL p)
{
LL ret = ;
for (int i = ; i <= n; i++) ret = ret * i % p;
return ret;
} LL comp(LL n, LL m, LL p)
{
if (n < || m > n) return ;
return fact(n, p) * inv(fact(m, p), p) % p * inv(fact(n - m, p), p) % p;
} LL lucas(LL a, LL b, LL m)
{
LL ans = ;
while (a && b)
{
ans = quickmul(ans, comp(a % m, b % m, m), m) % m;
a /= m; b /= m;
}
return ans;
} //n个方程:x=a[i](mod m[i])
LL china(int n, LL* a, LL* m)
{
LL M = , d, y, x = ;
for (int i = ; i < n; i++) M *= m[i];
for (int i = ; i < n; i++)
{
LL w = M / m[i];
gcd(m[i], w, d, d, y);
x = (x + quickmul(quickmul(w,y, M),a[i],M)) % M; //直接乘会爆long long,要用按位乘
}
return (x + M) % M;
} int k;
LL n, m;
LL p[ + ],r[ + ]; int main()
{
int T;
scanf("%d", &T);
while (T--)
{
cin >> n >> m >> k;
for (int i = ; i < k; i++)
cin >> p[i];
for (int i = ; i < k; i++)
r[i] = lucas(n, m, p[i]);
LL ans = china(k, r, p);
cout << ans << endl;
} return ;
}
参考链接:https://www.cnblogs.com/linyujun/p/5199684.html
中国剩余定理&Lucas定理&按位与——hdu 5446的更多相关文章
- 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理
[bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...
- HDU 5446 中国剩余定理+lucas
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- FJNU2018低程A 逃跑路线(Lucas + 中国剩余定理 + LGV定理)题解
题目描述 n个人在w*h的监狱里面想要逃跑,已知他们的同伙在坐标(bi,h)接应他们,他们现在被关在(ai,1)现在他们必须要到同伙那里才有逃出去的机会,这n个人又很蠢只会从(x,y)->(x+ ...
- hdu 5446 Unknown Treasure 中国剩余定理+lucas
题目链接 求C(n, m)%p的值, n, m<=1e18, p = p1*p2*...pk. pi是质数. 先求出C(n, m)%pi的值, 然后这就是一个同余的式子. 用中国剩余定理求解. ...
- CRT中国剩余定理 & Lucas卢卡斯定理
数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...
- 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix
Tom and matrix Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5226 Mean: 题意很简单,略. analy ...
- 【组合数+Lucas定理模板】HDU 3037 Saving
acm.hdu.edu.cn/showproblem.php?pid=3037 [题意] m个松果,n棵树 求把最多m个松果分配到最多n棵树的方案数 方案数有可能很大,模素数p 1 <= n, ...
- HDU 5446 Unknown Treasure
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- 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.. ...
随机推荐
- TypeScript完全解读(26课时)_8.ES6精讲-ES6中的类(进阶)
8.TypeScript完全解读-ES6精讲-类(进阶) 在index.ts内引入 Food创建的实例赋值给Vegetabled这个原型对象,这样使用Vegetables创建实例的时候,就能继承到Fo ...
- jquery中innerheight outerHeight()与height()的区别
1. .height() 获取匹配元素集合中的第一个元素的当前计算高度值 或 设置每一个匹配元素的高度值(带一个参数). 注意:1).css('height')和.height()之间的区别是后者返回 ...
- Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
一.前言 Job for mysqld.service failed because the control process exited with error code. See "sys ...
- ES6笔记总结
常用命令 函数的rest参数和扩展 promise使用 module.exports和Es6 import/export的使用 function sum(x,y,z){ let total = 0; ...
- Android之打包签名
一.什么的是打包? 打包就是根据签名和其他标识生成安装包. 二.什么是签名? 1.在android应用文件(apk)中保存的一个特别字符串 2.用来标识不同的应用开发者:开发者A,开发者B 3.一个应 ...
- 51nod1483(打表)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1483 题意:中文题诶- 思路: 在输入时预处理每个数据能达到的 ...
- hoj2798 Globulous Gumdrops
Globulous Gumdrops My Tags (Edit) Source : 2008 Stanford Programming Contest Time limit : 1 se ...
- [HNOI2010] 合唱队 chorus
标签:区间DP.题解: 首先分析题目,根据题目中的列队方式以及数据范围,我们容易想到O(n2)的算法,也就是区间DP.发现直接dp[L][R],不能转移,于是添加一个dp[L][R][0/1],0表示 ...
- NSString 是否存在空格
NSString *_string = [NSString stringWithFormat:@"123 456"]; NSRange _range = [_string rang ...
- [題解]51nod_1515_明辨是非
好久沒有話多了,是覺得有點浪費時間,今天考試和一中用的一樣的題,結果反而考得不好,不過Jackpei一句知恥而後勇點醒夢中人偷偷@Jackpei 就是這樣吧 還有我極度懷疑我的鍵帽打油了......我 ...