http://acm.hdu.edu.cn/showproblem.php?pid=5446

题意:题目意思很简单,要你求C(n,m)mod p的值 p=p1*p2*...pn;

题解:对于C(n,m)mod p 由于n,m的值很大 我们用lucas定理把n,m的范围缩小。由于模数是由若干个素数的乘积组成,那么对于最终要求的解x,我们可以用中国剩余定理求解。中国剩余定理如下:

设正整数两两互素,则同余方程组

有整数解。并且在模下的解是唯一的,解为

其中,而的逆元。

最后说一点,由于数据的范围还是比较大,在乘法求解的过程中,如果用普通的乘法,是会溢出的,这里还要用到按位乘法(具体看代#include <cstdio>#include <iostream>

#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
ll m[],a[];
ll mul(ll a,ll b,ll p)// 按位乘
{
ll ret=;
while(b)
{
if(b&) ret=(ret+a)%p;
b=b>>;
a=(a+a)%p;
}
return ret; }
ll exgcd(ll a,ll b,ll &x,ll &y)// 扩展欧几里得
{
if(b==)
{
x=;
y=;
return a;
}
ll temp=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return temp;
}
ll finv(ll a,ll m)// 求逆元
{
ll x,y;
ll g=exgcd(a,m,x,y);
x=(x%m+m)%m;//
return x;
}
ll c(ll n,ll m,ll p)
{
if(m > n) return ;
ll a,b;
a=b=;
while(m)
{
a=(a*n)%p;
b=b*m%p;
n--;
m--;
}
return mul(a,finv(b,p),p);
}
ll lucas(ll n,ll m,int p)
{
if(m==) return ;// c(n,0)=1;
return mul(lucas(n/p,m/p,p),c(n%p,m%p,p),p);// lucas把组合数要求解的范围缩小到了p之内
} ll crt(int len)
{
ll sum=;
ll M=;
for(int i=;i<=len;i++) M*=m[i];
for(int i=;i<=len;i++)
{
ll temp=M/m[i];
sum=(sum+mul(mul(a[i],temp,M),finv(temp,m[i]),M))%M;// 这里有一个数据溢出的问题 对于相乘数据会溢出的问题 用转为二进制的按位乘法
}
return sum;
} void init(ll p)
{
fac[]=;
fac[]=;
for(ll i=;i<=p;i++) fac[i]=fac[i]*i%p;
}
int main()
{
cin.sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
ll n,mm,k;
cin>>n>>mm>>k;
init(k);
for(int i=;i<=k;i++)
{
cin>>m[i];
a[i]=lucas(n,mm,m[i]);
}
cout<<crt(k)<<endl;
}
return ;
}

hdu 5446 lucas+crt+按位乘的更多相关文章

  1. HDU 5446 lucas CRT

    n中选m个模M,M为多个素数之积 $n, m, k (1 \leq m \leq n \leq 10^{18}, 1 \leq k \leq 10)$,$M = p_1 · p_2 · · · p_k ...

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

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

  3. 中国剩余定理&Lucas定理&按位与——hdu 5446

    链接: hdu 5446 http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意: 给你三个数$n, m, k$ 第二行是$k$个数,$p_1,p_2,p_ ...

  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定理+CRT)

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

  6. hdu 5446 Unknown Treasure lucas和CRT

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

  7. hdu 5446(中国剩余+lucas+按位乘)

    题意:c( n, m)%M    M = P1 * P2 * ......* Pk Lucas定理是用来求 c(n,m) mod p,p为素数的值.得出一个存余数数组,在结合中国剩余定理求值 其中有个 ...

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

  9. HDU 5446 CRT+Lucas+快速乘

    Unknown Treasure Problem Description On the way to the next secret treasure hiding place, the mathem ...

随机推荐

  1. Linux上命令行检出、提交和更新操作

    1.创建工作区目录 列:我创建两个工作目录,用来模拟两个开发人员,命令如下:(工作路径可以按照自己需要随意改变) mkdir -p /root/workspace/harry mkdir -p /ro ...

  2. java 架构师思维导图

    java 基础 . 理解IO.多线程.集合等基础框架.对JVM原理有一定了解. spring  spring boot  ibatis   structs开源框架了解. 熟悉分布式系统设计和应用. 小 ...

  3. 冲刺阶段——Day3

    [今日进展] 完善黄金点游戏的算法与代码架构. 将文字界面改编为图形界面 码云链接:https://gitee.com/jxxydwt1999/20175215-java/blob/master/Go ...

  4. Web开发中 MTV模式与MVC模式的区别 联系 概念

    MTV 与 MVC模式的区别 联系 概念: MTV: 所谓MTV指的就是: M:model (模型),指的是ORM模型. T:template (模板),一般Python都是使用模板渲染的方式来把HT ...

  5. iOS实现图片无限轮播之使用第三方库SDCycleScrollView(转)

    下载链接:github不断更新地址:https://github.com/gsdios/SDCycleScrollView #import "ViewController.h" # ...

  6. 针对thinkphp 5框架存储过程bug而重写的存储过程的扩展类

    近期用tp5框架调取存储过程发现有bug,借鉴了一些官方的函数.以及找了个mysqli的类把存储过程重新写了个扩展类,下面两个类直接放置项目extend目录的stored(这个文件夹名称请按个人习惯命 ...

  7. 如何解决滚动条scrollbar出现造成的页面宽度被挤压的问题

    参考如下: https://www.ucloud.cn/yun/114228.html

  8. 当微信小程序遇到AR(三)

    当微信小程序遇到AR,会擦出怎么样的火花?期待与激动...... 通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习. 本课程需要一定的基础:微信开发者工具,JavaS ...

  9. godot新手教程2[godot常用代码用法]

    Godot概念: 在godot内,使用的语言是GDScript,大部分代码风格是和python一样. 在GDScript内代码段结束是换到下一行即可,不需要也不能添加”;”号,(注意:代码段结束后不能 ...

  10. 终端复用器tmux基础使用

    简介对于经常操作Linux系统的同学来说,远程连接Linux服务器使用最多的工具是SecureCRT或者Xshell,而将此时的环境称为终端环境.Tmux是两个单词的缩写,即“Terminal Mul ...