HDU 5446 2015长春站网络赛1010(数论模板题)
来源:互联网 发布:通信工程定额软件 编辑:程序博客网 时间:2024/05/19 12:11
这道题知道两个东西就能写出来:lucas+CRT(中国剩余定理),题目很裸。但是有一个坑,就是相乘的时候会爆LL!!!这个时候用一个快速乘就搞定了,这个也是这道题才学会的,其实快速成很简单,就是把一个数变成2进制,然后把*改成了+法(和快速幂基本一样)。
lucas定理: C(n,m) == C(n/p,m/p)*C(n%p,m%p) (mod p) ,p为素数。
证明可以看cxlove大神的博客:lucas定理的证明
下面直接给出AC代码:
**#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#define LL long long#define FOR(i,x,y) for(int i = x;i < y;i ++)#define IFOR(i,x,y) for(int i = x;i > y;i --)#define MAXN 110000using namespace std;LL fac[MAXN];//快速幂LL QuickPow(LL a,LL n,LL mod){ LL ans=1; while(n){ if(n&1) ans = (ans*a)%mod; a = (a*a)%mod; n>>=1; } return ans;}//快速乘LL Mul(LL a,LL b,LL mod){ LL ret = 0; while(b){ if(b&1) ret = (ret+a)%mod; a = (a+a)%mod; b >>= 1; } return ret;}void Get_Fac(LL p){ fac[0] = 1; for(int i = 1;i <= p;i ++){ fac[i] = fac[i-1]*i; fac[i] %= p; }}void Ex_Gcd(LL a,LL b,LL& d,LL& x,LL& y){ if(!b) {d =a; x = 1; y = 0;} else { Ex_Gcd(b,a%b,d,y,x); y -= x*(a/b);}}//lucas定理LL Lucas(LL n,LL m,LL p){ LL ret = 1; while(n && m){ LL a = n%p,b = m%p; if(a < b) return 0; ret = Mul(ret,Mul(fac[a],QuickPow(Mul(fac[a-b],fac[b],p),p-2,p),p),p); ret %= p; n /= p; m /= p; } return ret;}//中国剩余定理 x == a[i] (mod m[i]) 共有n个方程。LL CRT(LL n,LL* a,LL* m){ LL M = 1,d,y,x = 0; for(int i = 0;i < n;i ++) M *= m[i]; for(int i = 0;i < n;i ++){ LL w = M/m[i]; Ex_Gcd(m[i],w,d,d,y); x = (x + Mul(y,Mul(w,a[i],M),M)) % M; } return (x+M)%M;}int main(){ //freopen("test.in","r",stdin); int T; scanf("%d",&T); while(T--){ LL n,m,num,p[15],a[15]; scanf("%I64d%I64d%I64d",&n,&m,&num); for(int i = 0;i < num;i ++){ scanf("%I64d",&p[i]); } for(int i = 0;i < num;i ++){ Get_Fac(p[i]); a[i] = Lucas(n,m,p[i]); } printf("%I64d\n",CRT(num,a,p)); } return 0;}**
0 0
- HDU 5446 2015长春站网络赛1010(数论模板题)
- hdu 5446 Unknown Treasure 2015 长春网络赛 组合数对大合数取模 数论
- HDU 5451 2015长春站网赛1002(数论)
- hdu-5442(后缀数组,2015网络赛长春赛区)
- 2015长春网络赛(hdu 5442)
- hdu 5442 2015长春网络赛
- 网络赛长春赛区1004 数论,概率
- HDU 5437 Alisha’s Party(优先队列)(2015网络赛长春站)
- HDU 5442 2015长春站网络赛1006(后缀数组)
- HDU 5439. Aggregated Counting (2015长春网络赛C题)
- 2015长春网络赛
- hdu 4768 Flyer 长春网络赛 1010 二分
- [ACM]Flyer(长春网络赛1010)
- hdu5437(2015长春网络赛A题)
- hdu5438(2015长春网络赛B题)
- hdu5443(2015长春网络赛G题)
- hdu5444(2015长春网络赛H题)
- hdu5441(2015长春网络赛E题)
- apriori算法
- 字符流与字节流的区别
- 装饰器模式
- Opencv膨胀-dilate函数
- 【C#】基础知识—初识C#与.Net
- HDU 5446 2015长春站网络赛1010(数论模板题)
- 天天学设计模式1--重新认识面向对象
- android网络游戏开发——网络通信——回调函数例子
- 黑马程序员-java基础-set集合
- 深入分析Volatile的实现原理,原子操作
- Java中数组中的clone()方法
- SQL语法
- createjs-打豆豆小游戏制作(3)
- BOMB快速入门