题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446

题目大意:求C(n, m) % M, 其中M为不同素数的乘积,即M=p1*p2*...*pk, 1≤k≤10。1≤m≤n≤10^18。

分析: 如果M是素数,则可以直接用lucas定理来做,但是M不是素数,而是素数的连乘积。令C(n, m)为 X ,则可以利用lucas定理分别计算出 X%p1,X%p2, ... , X % pk的值,然后用中国剩余定理来组合得到所求结果。

比较坑的地方是,中间结果会超long long 范围,要用类似于快速幂的方法来模拟。

参考代码:

 #include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
long long a[];
long long Mod;
long long c[];
long long w[];
long long Egcd(long long a,long long b,long long &x,long long &y){
long long d;
if(b==){
x=;y=;
return a;
}
d=Egcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
long long cal(long long a, long long b, long long mod) {//模拟a*b%mod
long long ret = ;
while(b) {
if(b & ) ret = (ret + a) % mod;
a = (a + a) % mod;
b >>= ;
}
return ret;
} long long c_r(int len){//中国剩余定理
int i;
long long d,x,y,n,m,ret;
ret=;
n=;
for(i=;i<len;i++)
n*=c[i];
for(i=;i<len;i++){
m=n/c[i];
d=Egcd(m,c[i],y,x);
y=(c[i]+y%c[i])%c[i];
if( i&) y -= c[i];
//if(y>c[i]-y) y=y-c[i];
ret=(ret+cal(y*m, w[i], n))%n;
}
return (n+ret%n)%n;
} void init(){
int i;
memset(a, , sizeof(a));
a[]=;
for(i=;i<Mod;i++)
a[i]=a[i-]*i%Mod;
} long long gcd(long long a,long long b){
if(b==) return a;
return gcd(b,a%b);
} long long choose(long long n,long long m){
if(m>n)return ;
else if(n==m) return ;
long long nn=a[n],mm=a[m]*a[n-m]%Mod;
long long d=gcd(nn,mm);
nn/=d;
mm/=d;
long long x,y;
Egcd(mm,Mod,x,y);
x=(x+Mod)%Mod;
return (x*nn)%Mod;
} long long work(long long n,long long m){//lucas
long long ret=;
while(n&&m){
ret*=choose(n%Mod,m%Mod);
ret%=Mod;
n/=Mod,m/=Mod;
}
return ret;
} int main(){
int T;
long long n,m;
int k;
scanf("%d",&T);
while(T--){
cin >> n >> m >> k;
if(m > n-m) m = n-m;
for(int i=;i<k;i++){
cin >> c[i];
Mod=c[i];
init();
w[i]=work(n,m);
}
cout << c_r(k) << endl;
}
}

HDU 5446 Unknown Treasure(lucas + 中国剩余定理 + 模拟乘法)的更多相关文章

  1. HDU 5446 Unknown Treasure Lucas+中国剩余定理+按位乘

    HDU 5446 Unknown Treasure 题意:求C(n, m) %(p[1] * p[2] ··· p[k])     0< n,m < 1018 思路:这题基本上算是模版题了 ...

  2. HDU 5446 Unknown Treasure Lucas+中国剩余定理

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 Unknown Treasure 问题描述 On the way to the next se ...

  3. hdu 5446 Unknown Treasure lucas和CRT

    Unknown Treasure Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  4. hdu 5446 Unknown Treasure Lucas定理+中国剩余定理

    Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  5. 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.. ...

  6. ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)

    Problem Description On the way to the next secret treasure hiding place, the mathematician discovere ...

  7. hdu 5446 Unknown Treasure 中国剩余定理+lucas

    题目链接 求C(n, m)%p的值, n, m<=1e18, p = p1*p2*...pk. pi是质数. 先求出C(n, m)%pi的值, 然后这就是一个同余的式子. 用中国剩余定理求解. ...

  8. HDU 5446 Unknown Treasure(Lucas定理+CRT)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5446 [题目大意] 给出一个合数M的每一个质因子,同时给出n,m,求C(n,m)%M. [题解] ...

  9. HDU 5446——Unknown Treasure——————【CRT+lucas+exgcd+快速乘+递推求逆元】

    Each test case starts with three integers n,m,k(1≤m≤n≤1018,1≤k≤10) on a line where k is the number o ...

随机推荐

  1. 【MM系列】SAP 物料进销存报表查看

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]在SAP里查看数据的方法   前言部 ...

  2. C#得到10000以内素数

    偶数除了二都不是素数 一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n)--n的开方 int i, j, n = 10000; for (i = 3; i <= n; i += 2) ...

  3. Hello World!----html

    ​ 最近要做一个小网站,今晚想起来还是先看看前端终于抑制住惰性,开始看了. ​ 看了一下html,写了个hello world.老实讲,我竟然还有些小激动 ​ <html> <hea ...

  4. Time Series Anomaly Detection

    这里有个2015年的综述文章,概括的比较好,各种技术的适用场景.  https://iwringer.wordpress.com/2015/11/17/anomaly-detection-concep ...

  5. 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题2---CMAKE配置问题

    实际上这里说的是移植的第一步,下载到源码后,我用的是opencv2.4.9,解压缩,然后可以利用cmake-gui来进行configure配置,这里面需要设置交叉编译的工具链,具体的可以参考[Linu ...

  6. 牛客练习赛46 E 华华和奕奕学物理 (树状数组)

    https://ac.nowcoder.com/acm/contest/894/E 一开始写了一个简单的模拟 通过率只有5%...... 看题解真的理解了好久!!肥宅大哭orz 题解如下 最后一句:“ ...

  7. [Web 前端] 029 jQuery 元素的“节操”

    目录 jQuery 元素的节点操作 1. 创建节点 2. 插入节点 2.1 在现存元素的内部,从后面插入元素 2.2 在现存元素的内部,从前面插入元素 2.3 在现存元素的外部,从后面插入元素 2.4 ...

  8. swagger @ApiModel添加实体类不生效

    在使用swagger时, 以为加上@ApiModel在实体类上就可以在swagger-ui.html的Models里面显示. 但是我创建了很多实体类, 但怎么也只显示了一个??? Models中无论如 ...

  9. DateHandler日期处理工具(JSP中使用后台工具类)

    1.DateHandler.java package Utils.dateHandler; import java.text.ParseException; import java.text.Simp ...

  10. Shell的常用十八条命令

    Shell的18条常用命令整理 1. ls: 类似于dos下的dir命令 ls最常用的参数有三个: -a -l -F. ls –a Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看 ...