最近碰到一题,问你求mod (p1*p2*p3*……*pl) ,其中n和m数据范围是1~1e18 , l ≤10 , pi ≤ 1e5为不同的质数,并保证M=p1*p2*p3*……*pl ≤ 1e18 。

要解决这个问题首先需要Lucas定理 或者 C!解法。

Lucas定理

我们令n=sp+q , m=tp+rq , r ≤ p

那么,然后你只要继续对调用Lucas定理即可。

代码可以递归的去完成这个过程,其中递归终点为t = 0

伪代码,时间O(logp(n)*p)

int Lucas (ll n , ll m , int p) {
return m == 0 ? 1 : 1ll*comb (n%p , m%p , p) * Lucas (n/p , m/p , p) % p ;
}
//comb()函数中,因为q , r ≤ p , 所以这部分暴力完成即可。

 Lucas定理证明:

证明资料:http://www.cut-the-knot.org/arithmetic/algebra/LucasTheorem.shtml

首先你需要这个算式:,然后

(1 + x) n Ξ (1 + x) sp+q  Ξ ( (1 + x)p)s • (1 + x) q Ξ (1 + xp) s • (1 + x)   (mod p) ;

.

所以,通过左右系数比较,你就会发现当i=t , j=r  (及xtp+r的系数等式)成立。

 

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

#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int M = 1e5 + 10 ;
ll n , m ;
int k ;
int prime[15] ;
int rem[15] ; ll MM ; int F[15] ;
//int Finv[15][M] , F[15][M] , inv[15][M] ; ll mul (ll a , ll b , ll mod) {
ll tmp = 0 ;
while (b) {
if (b & 1) tmp = (1ll*tmp+a)%mod ;
b >>= 1 ;
a = (a+a)%mod ;
}
return tmp ;
} int Fermat (ll a , int b) {
int ret = 1 ;
int mod = b ;
b -= 2 ;
while (b) {
if (b & 1) ret = mul(ret , a , mod) ;
b >>= 1 ;
a = mul(a , a , mod) ;
}
return ret ;
} int fact (int n , int p) {
int ret = 1 ;
for (int i = 1 ; i <= n ; i ++) ret = 1ll*ret*i%p ;
return ret ;
} int comb (int n , int m , int p) {
if (m < 0 || m > n) return 0 ;
return 1ll* fact (n , p) * Fermat(fact (m , p) , p) * Fermat (fact(n-m , p) , p) % p ;
} int Lucas (ll n , ll m , int p) {
return m == 0 ? 1 : 1ll*comb (n%p , m%p , p) * Lucas (n/p , m/p , p) % p ;
} void solve () {
MM = 1 ;
for (int i = 1 ; i <= k ; i ++) {
rem[i] = Lucas (n , m , prime[i]) ;
MM *= 1ll*prime[i] ;
//cout << "rem[i] = " << rem[i] << endl;
}
ll sum = 0 ;
for (int i = 1 ; i <= k ; i ++) {
ll tmp = MM/prime[i] ;
ll ans = mul (rem[i] , Fermat(tmp , prime[i]) , MM) ;
sum = (sum + mul (ans , tmp , MM) ) % MM ;
}
printf ("%I64d\n" , sum);
} int main () {
int T ;
scanf ("%d" , &T) ;
while (T --) {
scanf ("%I64d%I64d%d\n" , &n , &m , &k) ;
for (int i = 1 ; i <= k ; i ++) {
scanf ("%d" , &prime[i]) ;
}
solve () ;
}
return 0 ;
}

大组合数:Lucas定理的更多相关文章

  1. uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT)

    uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT) uoj 题目描述自己看去吧( 题解时间 首先看到 $ p $ 这么小还是质数,第一时间想到 $ lucas $ 定理. 注意 ...

  2. [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)

    题目链接:http://acm.swust.edu.cn/problem/0247/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  3. 【BZOJ-4591】超能粒子炮·改 数论 + 组合数 + Lucas定理

    4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 95  Solved: 33[Submit][Statu ...

  4. luogu4345 [SHOI2015]超能粒子炮·改(组合数/Lucas定理)

    link 输入\(n,k\),求\(\sum_{i=0}^k{n\choose i}\)对2333取模,10万组询问,n,k<=1e18 注意到一个2333这个数字很小并且还是质数这一良好性质, ...

  5. 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it

    http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...

  6. 【组合数+Lucas定理模板】HDU 3037 Saving

    acm.hdu.edu.cn/showproblem.php?pid=3037 [题意] m个松果,n棵树 求把最多m个松果分配到最多n棵树的方案数 方案数有可能很大,模素数p 1 <= n, ...

  7. 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix

    Tom and matrix Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5226 Mean: 题意很简单,略. analy ...

  8. CodeForces-451E:Devu and Flowers (母函数+组合数+Lucas定理)

    Devu wants to decorate his garden with flowers. He has purchased n boxes, where the i-th box contain ...

  9. HDU3037Saving Beans(组合数+lucas定理)

    Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...

  10. 大组合数Lucas

    https://blog.csdn.net/sr_19930829/article/details/39058487 LL Lucas(LL n, LL m, int p){ ; } Saving B ...

随机推荐

  1. 【2016-10-31】【坚持学习】【Day16】【MongoDB】【入门】

    下载,安装: http://www.mongodb.org/downloads 命令行下运行 MongoDB 服务器 为了从命令提示符下运行MongoDB服务器,你必须从MongoDB目录的bin目录 ...

  2. Caffe源码解析6:Neuron_Layer

    转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ NeuronLayer,顾名思义这里就是神经元,激活函数的相应 ...

  3. loadrnner添加C语言代码的几种方式

    今天有人在群里问,想直接把自己的C语言代码让lr调用,该怎么搞. 这东西说来简单,只是对Loadrunner这工具不熟悉可能才会有这种问题吧.个人理解,一般有三种方法吧,废话不多,直接干货. 1.直接 ...

  4. Hibernate 延迟加载和立即加载

    概念 什么是延迟加载:所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作.可以简单理解为,只有在使用的时候,才会发出sql语句进行查询,数据是分N次读取. 什么是立即加载:所谓立即加载既是 ...

  5. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  6. NOI2018准备Day14晚

    1个小时调处了前天晚上卡了一个晚上的数独,果然还是dfs回溯的问题. 1个小时做codevs2500城堡,然而并没有做出来 剩下1个小时,做了一道字符串的STL,空格和换行符 ,真心累啊...... ...

  7. ExtJS4随笔(1) -- 在VS中加入Ext4的智能提示

    将辅助文件加入到Web工程内即可. 辅助文件

  8. scalatest的userguide

    http://www.scalatest.org/user_guide 感觉功能很强大.这门语言有前途.

  9. vue2.0 开发实践总结之入门篇

    vue2.0 据说也出了很久了,博主终于操了一次实刀. 整体项目采用  vue +  vue-router +  vuex (传说中的vue 全家桶 ),构建工具使用尤大大推出的vue-cli 后续文 ...

  10. 2016-1-1最新版本的linphone-android在mac上编译通过,同时建立了IDEA工程

    虽然参考了这个文章<MAC OS编译Android版Linphone SDK和APP>,https://www.lidaren.com/archives/1592 ,但是在实际的编译过程中 ...