hdu 5446 Unknown Treasure 中国剩余定理+lucas
求C(n, m)%p的值, n, m<=1e18, p = p1*p2*...pk. pi是质数。
先求出C(n, m)%pi的值, 然后这就是一个同余的式子。 用中国剩余定理求解。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define ll long long
ll a[], b[];
void extend_Euclid(ll a, ll b, ll &x, ll &y)
{
if(b == )
{
x = ;
y = ;
return;
}
extend_Euclid(b, a % b, x, y);
ll tmp = x;
x = y;
y = tmp - (a / b) * y;
}
ll mul(ll a, ll n, ll mod)
{
a = (a%mod+mod)%mod;
n = (n%mod+mod)%mod;
ll ret = ;
while(n) {
if(n&)
ret = (ret+a)%mod;
a = (a+a)%mod;
n >>= ;
}
return ret;
}
ll CRT(ll a[],ll m[],int n)
{
ll M = ;
ll ans = ;
for(int i=; i<=n; i++)
M *= m[i];
for(int i=; i<=n; i++)
{
ll x, y;
ll Mi = M / m[i];
extend_Euclid(Mi, m[i], x, y);
ans = (ans + mul(mul(Mi, x, M), a[i], M))%M;
}
return (ans+M)%M;
}
ll pow(ll a, ll b, ll mod)
{
ll ret = ;
while(b) {
if(b&) ret = ret*a%mod;
a = a*a%mod;
b /= ;
}
return ret;
}
ll C(ll n, ll m, ll mod)
{
ll a = , b = ;
for(int i = ; i <= m; i++) {
b = b*i%mod;
a = a*(n-i+)%mod;
}
return a*pow(b, mod-, mod)%mod;
}
ll lucas(ll n, ll m, ll mod)
{
if(m == )
return ;
return lucas(n/mod, m/mod, mod)*C(n%mod, m%mod, mod)%mod;
}
int main()
{
ll t, n, m, k;
cin>>t;
while(t--) {
cin>>n>>m>>k;
for(int i = ; i <= k; i++) {
scanf("%lld", &a[i]);
}
for(int i = ; i <= k; i++) {
b[i] = lucas(n, m, a[i]);
}
ll ans = CRT(b, a, k);
cout<<ans<<endl;
}
return ;
}
hdu 5446 Unknown Treasure 中国剩余定理+lucas的更多相关文章
- 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 ...
- 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
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- 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 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定理+中国剩余定理
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- HDU 5446 Unknown Treasure(Lucas定理+CRT)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5446 [题目大意] 给出一个合数M的每一个质因子,同时给出n,m,求C(n,m)%M. [题解] ...
随机推荐
- HDU-1049
Description An inch worm is at the bottom of a well n inches deep. It has enough energy to climb u i ...
- Codeforces Round #194 (Div. 2) D. Chips
D. Chips time limit per test:1 second memory limit per test:256 megabytes input:standard input outpu ...
- SimpleDateFormat的使用
SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (date -> text).语法分析 (text -> date)和标准化. 下面是个小 ...
- Scrapy安装问题
按照说明直接使用pip install scrapy会有两个问题: fatal error: 'ffi.h' file not found fatal error: 'libxml/xmlversio ...
- 用JavaScript将数字转换为大写金额
var digitUppercase = function(n) { var fraction = ['角', '分']; var digit = [ '零', '壹', '贰', '叁', '肆', ...
- USB OTG介绍(转载)
1. 概要 OTG设备使用插头中的ID引脚来区分A/B Device,ID接地被称作为A-Device,为连接时候的USB Host,A-Device始终为总线提供电力,ID悬空被称作为B-Devic ...
- LoggingApplicationListener
org.springframework.boot:spring-boot:1.3.0.M1 spring-boot-1.3.0.M1.jar package org.springframework.b ...
- 文艺编程 Literate Programming
(译注:这篇文章是 Donald Knuth 一篇1983年的论文:Literate Programming 的介绍部分.有人翻译为“字面编程”,是极其错误的说法,literate 根本就没有“字面” ...
- perl tk说明
介绍: perl/Tk(也被称为pTK) 是一个模块和代码的收集,尝试 简单的配置Tk 8 部件工具包到强大的词素文文字, 动态内存,I/O, 和面向对象,它是一种解释脚本语言 来制作部件和程序 使用 ...
- ios中block中的探究
http://blog.csdn.net/jasonblog/article/details/7756763