Lucas定理

题目
Lucas定理要求mod为素数

#include<stdio.h>
#include <string.h>
using namespace std;
#define Mod 1000000007
typedef long long LL;
LL mod;
/*
根据费马小定理:

已知(a, p) = 1,则 a^(p-1) ≡ 1 (mod p),  所以 a*a^(p-2) ≡ 1 (mod p)。

也就是 (m!)的取模逆元为 (m!)^p-2 ;
*/
LL quick_mod(LL a, LL b)
{
    LL ans = 1;
    a %= mod;
    while(b)
    {
        if(b & 1)
        {
            ans = ans * a % mod;
        }
        b >>= 1;
        a = a * a % mod;
    }
    return ans;
}
LL C(LL a, LL b) {
    if(a < b)   return 0;
    LL ans = 1, ca = 1, cb = 1;
    for(LL i = 0; i < b; ++i) {
        ca = (ca * (a - i))%mod;
        cb = (cb * (b - i))%mod;
    }
    ans = (ca*quick_mod(cb, mod - 2)) % mod;
    return ans;
}
LL Lucas(LL n,LL m)
{
    if(m==0) return 1;
    return C(n%mod,m%mod)*Lucas(n/mod,m/mod);
}
int main()
{
    int t;
    scanf("%d",&t);
    LL a,b;
     while(t--)
        {
            scanf("%I64d%I64d%I64d",&a,&b,&mod);
        printf("%I64d\n",Lucas(a,b));
        }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从一个例题:【HDU 3037】 Saving Beans 来开始Lucas定理的应用。题目大意为:松鼠要从n棵树...
    碧影江白阅读 1,689评论 0 0
  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,466评论 0 160
  • 转载自Matrix大牛一个数是素数(也叫质数),当且仅当它的约数只有两个——1和它本身。规定这两个约数不能相同,因...
    Gitfan阅读 2,129评论 0 1
  • 【14】 Lucas回到家,刚一进屋就闻到一阵饭香,原来老妈提前下班,做了他喜欢吃的菜。 “欢迎回家!”Maria...
    丨sammi21丨阅读 565评论 0 0
  • 今天吃过午饭,我把宝宝放到他的小床上,让他在里面玩。 他的小床上有很多玩具。很多海洋球,两本布书,一个小绒娃娃,一...
    简单1909阅读 177评论 0 0