BZOJ 4403 2982 Lucas定理模板

思路:

Lucas定理的模板题..

4403

//By SiriusRen
#include <cstdio>
using namespace std;
const int mod=1000003;
#define int long long
int cases,N,L,R,fac[mod],inv[mod];
int C(int n,int m){
    if(n<m)return 0;
    if(n<mod&&m<mod)return fac[n]*inv[n-m]%mod*inv[m]%mod;
    return C(n/mod,m/mod)*C(n%mod,m%mod)%mod;
}
signed main(){
    fac[0]=inv[0]=inv[1]=1;
    for(int i=1;i<mod;i++)fac[i]=fac[i-1]*i%mod;
    for(int i=2;i<mod;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    for(int i=1;i<mod;i++)inv[i]=inv[i-1]*inv[i]%mod;
    scanf("%lld",&cases);
    while(cases--)scanf("%lld%lld%lld",&N,&L,&R),printf("%lld\n",(C(N+R-L+1,R-L+1)-1+mod)%mod);
}

2982

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int p=10007;
int fac[p],inv[p],n,m,cases;
int C(int i,int j){
    if(i<j)return 0;
    if(i<p&&j<p)return fac[i]*inv[j]%p*inv[i-j]%p;
    return C(i/p,j/p)*C(i%p,j%p)%p;
}
signed main(){
    fac[0]=fac[1]=inv[0]=inv[1]=1;
    for(int i=2;i<p;i++)fac[i]=fac[i-1]*i%p;
    for(int i=2;i<p;i++)inv[i]=(p-p/i)*inv[p%i]%p;
    for(int i=1;i<p;i++)inv[i]=inv[i-1]*inv[i]%p;
    scanf("%lld",&cases);
    while(cases--){
        scanf("%lld%lld",&n,&m);
        printf("%lld\n",C(n,m));
    }
}
时间: 2024-10-02 05:00:27

BZOJ 4403 2982 Lucas定理模板的相关文章

大组合数取模之lucas定理模板,1&lt;=n&lt;=m&lt;=1e9,1&lt;p&lt;=1e6,p必须为素数

typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数 输入:C(n,m)%p 调用lucas(n,m,p) 复杂度:min(m,p)*log(m) ***********************************/ //ax + by = gcd(a,b) //传入固定值a,b.放回 d=gcd(a,b), x , y

[HDU 3461] Saving Beans &amp; 组合计数Lucas定理模板

Saving Beans Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description Although winter is far away, squirrels have to work day and night to save beans. They need plenty of food to get through those long cold

Lucas定理模板

用于大组合数对p取模的计算. 1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 #define maxn 100010 8 typedef long long LL; 9 10 LL m,n,p; 11 LL Pow(LL a,LL b,L

HDU 3037 Saving Beans(Lucas定理模板题)

Problem Description Although winter is far away, squirrels have to work day and night to save beans. They need plenty of food to get through those long cold days. After some time the squirrel family thinks that they have to solve a problem. They supp

BZOJ 2982 combination Lucas定理

题目大意:求C(n,m)%p. 思路:Lucas定理:C(n,m)%p = C(n/p,m/p)*C(n%p,m%p)%p 处理出来1~10007所有的阶乘和阶乘的逆元,nm都小于10007的时候就可以直接算了,剩下的情况递归处理. CODE: #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>

【Lucas定理/费马小定理/中国剩余定理/扩展欧几里得】[BZOJ 1951] 古代猪文

[Description] 求 [Solution] 容易得到, 所以,重点在怎么求 如果是p-1是个质数,我们可以用sqrt(n)的时间枚举所有d,用Lucas定理分别计算求和即可. 但是我们发现p-1=2*3*4679*35617,并不是一个质数,所以Lucas定理不能用了吗?并不,我们可以算出这个合式分别对2.3.4679.35617的模值,写出四个同余方程,再用孙子定理求解即可.注意特判g==p的情况,此时费马小定理不成立,ans=0. [Code] #include<cmath> #

bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2111 [题意] 给定n,问1..n的排列中有多少个可以构成小根堆. [思路] 设f[i]为以i为根的方案数,设l为左子树大小r为右子树大小,则有: f[i]=C(i-1,l)*f[l]*f[r] 因为是个堆,所以子树大小都是确定的,可以直接递推得到. 其中C(n,m) nm比较大,可以用lucas定理求. 模型建立的重要性可知一二... [代码] 1 #include<cstdio>

Bzoj 4591: [Shoi2015]超能粒子炮&#183;改 数论,Lucas定理,排列组合

4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 178  Solved: 70[Submit][Status][Discuss] Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提升.它有三个参数n,k.它会 向编号为0到k的位置发射威力为C(n

BZOJ 2111 ZJOI2010 Perm 排列计数 组合数学+Lucas定理

题目大意:求1~n的排列能组成多少种小根堆 考虑一个1~i的排列所构成的堆,l为左儿子大小,r为右儿子的大小 那么1一定是堆顶 左儿子和右儿子分别是一个堆 显然如果选出l个数给左儿子 那么左儿子的方案数显然是f[l],右儿子的方案数为f[r] 于是有f[i]=C(i-1,l)*f[l]*f[r] 于是我们线性筛处理出阶乘和阶乘的逆元 代入即可得到WA 原因是这题n可以大于p 此时要用到Lucas定理 坑死了 #include <cstdio> #include <cstring>