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

C(n, m) % (p1*p2*p3*...*pk)的值

其实这个就是中国剩余定理最后算出结果后的最后一步求余

那C(n, m)相当于以前我们需要用中国剩余定理求的值

然而C(n, m)太大,我们只好先算出

C(n, m) % p1 = r1

C(n, m) % p2 = r2

C(n, m) % p3 = r3

.

.

.

C(n, m) % pk = rk

用Lucas,这些r1,r2,r3...rk可以算出来

然后用中国剩余定理求满足num%p[i]=r[i]的最小num即可,num既是所求答案;

注意在运算过程中会出现数相乘爆long long,所以要手动写乘法求余;

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <math.h> using namespace std; #define met(a, b) memset(a, b, sizeof(a))
#define N 153
#define INF 0x3f3f3f3f typedef long long LL; ///快速幂计算a*b%p,因为a*b直接相乘可能会爆LL;
LL Mul(LL a, LL b, LL p)
{
a = (a+p)%p;
b = (b+p)%p;
LL ans = ;
while(b)
{
if(b%)
ans = (ans+a)%p;
a=(a+a)%p;
b/=;
}
return ans;
} ///用快速幂求a^b%p;
LL quick_mod(LL a, LL b, LL p)
{
LL ans = ;
a %= p;
while(b)
{
if(b&)
{
ans = ans*a%p;
b--;
}
b = b/;
a = a*a%p;
}
return ans;
}
///求C(n, m)%p;
LL C(LL n, LL m, LL p)
{
if(m > n)return ;
LL ans = ;
for(int i=; i<=m; i++)
{
LL a = (n+i-m)%p;
LL b = i%p;
ans = ans*(a*quick_mod(b, p-, p)%p)%p;
}
return ans;
}
///卢卡斯用于求C(n, m)%p;
LL Lucas(LL n, LL m, LL p)
{
if(m == )return ;
return C(n%p, m%p, p) * Lucas(n/p, m/p, p)%p;
}
///扩展欧几里德 求ax+by = gcd(a, b)中的x和y
void ex_gcd(LL a, LL b, LL &x, LL &y)
{
if(b == )
{
x = ;
y = ;
return;
}
ex_gcd(b, a%b, x, y);
int t = x;
x = y;
y = t - a/b*y;
if( a*b < )///当ab异号时;
{
x = -x;
y = -y;
}
}
///已知 num%p[i]=r[i];求满足n个式子的最小num,其中p[i]是素数;
LL China(int n, LL p[], LL r[])
{
LL m = , num = ;
for(int i=; i<=n; i++)
m *= p[i];
for(int i=; i<=n; i++)
{
LL x, y, a = m/p[i], b = -p[i];
ex_gcd(a, b, x, y);
LL t = Mul(a, x, m);///Mul就是乘法,防止爆longlong;
num = (num + Mul(t, r[i], m) + m) % m;
}
return (num+m)%m;
} int main()
{
LL n, m;
int k, T;
scanf("%d", &T);
while(T--)
{
LL p[], r[];
scanf("%I64d %I64d %d", &n, &m, &k);
for(int i=; i<=k; i++)
{
scanf("%I64d", &p[i]);
r[i] = Lucas(n, m, p[i]);
}
printf("%I64d\n", China(k, p, r));
}
return ;
}

Unknown Treasure---hdu5446(卢卡斯+中国剩余定理)的更多相关文章

  1. ACM-ICPC 2015 Changchun Preliminary Contest J. Unknown Treasure (卢卡斯定理+中国剩余定理)

    题目链接:https://nanti.jisuanke.com/t/A1842 题目大意:给定整数n,m,k,其中1≤m≤n≤1018,k≤10, 然后给出k个素数,保证M=p[1]*p[2]……*p ...

  2. Unknown Treasure (卢卡斯 + 孙子定理, 模板题)

    Unknown Treasure 参考链接 : https://www.cnblogs.com/linyujun/p/5199684.html 卢卡斯定理 : C(n, m) % p  =  C(n ...

  3. Unknown Treasure(hdu5446)

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

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

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

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

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

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

  7. Lucas+中国剩余定理 HDOJ 5446 Unknown Treasure

    题目传送门 题意:很裸,就是求C (n, m) % (p1 * p2 * p3 * .... * pk) 分析:首先n,m<= 1e18, 要用到Lucas定理求大组合数取模,当然p[]的乘积& ...

  8. HDU 5446 Unknown Treasure(lucas + 中国剩余定理 + 模拟乘法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 题目大意:求C(n, m) % M, 其中M为不同素数的乘积,即M=p1*p2*...*pk, ...

  9. [SDOI2010] 古代猪文 (快速幂+中国剩余定理+欧拉定理+卢卡斯定理) 解题报告

    题目链接:https://www.luogu.org/problemnew/show/P2480 题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色 ...

随机推荐

  1. R语言低级绘图函数-axis

    axis函数用来在一张图表上添加轴线,区别于传统的x轴和y轴,axis 允许在上,下,左, 右4个方向添加轴线 以x轴为例,一条轴线包含3个元素,水平的一条横线,叫做axis line , 刻度线, ...

  2. 从VirtualBox虚拟主机访问NAT客户机的方法

    转自:http://www.jb51.net/os/other/352995.html VirtualBox对虚拟机支持几种不同的网络方式,其中一种是NAT网络.当虚拟机启用NAT后,VirtualB ...

  3. 【java 类加载的深入研究1】loadClass()的研究

    1.开门见山 以前曾经看到过一个java的面试题,当时觉得此题很简单,可是自己把代码运行起来,可是结果并不是自己想象的那样.题目如下: class SingleTon { private static ...

  4. mysql命令收集

    1.显示当前用户的权限

  5. Xcode 5: 将新项目同步到Svn上

    stackoverflow 两种办法,一是使用比较成熟的svn客户端,二是使用终端.以下为终端方法: 假设已经通过Xcode->Preferences->Accounts将reposito ...

  6. C++ 获取当前时间

    #include <time.h> #include <stdio.h> int main( void ) {     time_t t = time(0);     char ...

  7. DLL文件的使用

    一. 动态链接库 什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是Dynamic Link Library 的缩写形式,动态链接库 (DLL) 是作为共享函数库的可执行文件.动态链接提供了 ...

  8. Java精选笔记_集合【Set(集合)接口】

    Set(集合)接口 简介 同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了. ...

  9. HTTP 代理

    HTTP 代理: (1) 如果我们一直用同一个IP去爬取同一个网站上的网页,久了之后可能会被该网站服务器屏蔽,因此我们可以使用代理IP来爬取,代理实际上指的就是代理服务器(2) 当我们使用代理IP爬取 ...

  10. Putty的安装和使用

     Putty是最简单易用的SSH工具,详细介绍其安装和使用 直接在百度里搜索Putty,可以找到百度软件中心,或者官方网站: PuTTY Download Page.  进入官方网站,直接可执行文件装 ...