• 洛谷P3807 【模板】卢卡斯定理


    P3807 【模板】卢卡斯定理

    题目背景

    这是一道模板题。

    题目描述

    给定n,m,p(1le n,m,ple 10^51n,m,p105​​)

    求 C_{n+m}^{m} mod pCn+mm​​ mod p

    保证P为prime

    C表示组合数。

    一个测试点内包含多组数据。

    输入输出格式

    输入格式:

    第一行一个整数T(Tle 10T10),表示数据组数

    第二行开始共T行,每行三个数n m p,意义如上

    输出格式:

    共T行,每行一个整数表示答案。

    输入输出样例

    输入样例#1:
    2
    1 2 5
    2 1 5
    输出样例#1:
    3
    3

    Lucas定理是用于处理组合数取模的定理

    通常用于解决阶乘无法解决的问题。

    
    
    #include<bits/stdc++.h>
    #define N 100010
    using namespace std;
    typedef long long ll;
    ll a[N];
    int p;
    ll pow(ll y,int z,int p){
        ll res=1;y%=p;
        while(z){
            if(z&1)res=res*y%p;
            y=y*y%p;
            z>>=1;
        }
        return res;
    }
    ll C(ll n,ll m){
        if(m>n)return 0;
        return ((a[n]*pow(a[m],p-2,p))%p*pow(a[n-m],p-2,p)%p);
    }
    ll Lucas(ll n,ll m){
        if(!m)return 1;
        return C(n%p,m%p)*Lucas(n/p,m/p)%p;
    }
    int main(){
        int T;scanf("%d",&T);
        int n,m;
        while(T--){
            scanf("%d%d%d",&n,&m,&p);
            a[0]=1;
            for(int i=1;i<=p;i++)a[i]=(a[i-1]*i)%p;
            cout<<Lucas(n+m,n)<<endl;
        }
    }
  • 相关阅读:
    Android实现监测网络状态
    安卓开源库之动画篇
    安卓向服务器发送List数据
    Material Design综合实例
    Material Design入门(三)
    Android之Fragment(二)
    Android之Fragment(一)
    Material Design入门(二)
    Material Design入门
    Android之ActionBar
  • 原文地址:https://www.cnblogs.com/thmyl/p/7575948.html
Copyright © 2020-2023  润新知