HDU5446:Unknown Treasure——题解

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

求C(n,m)%(p1p2…pk)的值,其中pi均为质数。

参考:https://www.cnblogs.com/linyujun/p/5199684.html

预备知识:

1.Lucas定理(图片来自百科):当p为素数时,有

2.中国剩余定理:

3.求逆元。

根据中国剩余定理可知,我们求C(n,m)%(p1p2…pk),实际就是在求解同余方程组:

C(n,m)%p1=a1

C(n,m)%p2=a2

……

C(n,m)%p3=a3

最终求得的C(n,m)即是在%(p1p2…pk)意义下的。

根据lucas定理,我们能立刻求出所有a的值。

在那之后用中国剩余定理求解即可。

(另外如果逆元不存在的话我就不知道怎么做了emmm……不过看数据貌似避开了这个问题)

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll qpow(ll k,ll n,ll p){
    ll ans=1;
    while(n){
        if(n&1)ans=ans*k%p;
        k=k*k%p;n>>=1;
    }
    return ans;
}
ll mul(ll a,ll b,ll p){
    ll ans=0;
    while(b){
        if(b&1)ans=(ans+a)%p;
        a=(a<<1)%p;b>>=1;
    }
    return ans;
}
ll C(ll n,ll m,ll p){
    if(n<m)return 0;
    if(n==m)return 1;
    if(m>n-m)m=n-m;
    ll cn=1,cm=1;
    for(ll i=0;i<m;i++){
        cn=cn*(n-i)%p;
        cm=cm*(m-i)%p;
    }
    return cn*qpow(cm%p,p-2,p)%p;
}
ll lucas(ll n,ll m,ll p){
    ll ans=1;
    while(n&&m&&ans){
        ans=ans*C(n%p,m%p,p)%p;
        n/=p;m/=p;
    }
    return ans;
}
int t;
ll n,m,k,p[11],r[11],P;
int main(){
    cin>>t;
    while(t--){
        cin>>n>>m>>k;P=1;
        for(int i=1;i<=k;i++){
            cin>>p[i];P*=p[i];
            r[i]=lucas(n,m,p[i]);
        }
        ll ans=0;
        for(int i=1;i<=k;i++){
            ll w=P/p[i],inv=qpow(w%p[i],p[i]-2,p[i]);
            ans=(ans+mul(w*inv,r[i],P))%P;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

原文地址:https://www.cnblogs.com/luyouqi233/p/8456874.html

时间: 2024-11-10 07:28:59

HDU5446:Unknown Treasure——题解的相关文章

HDU5446 Unknown Treasure

前几天长春网络赛一道lucas + CRT 模板题,当时没做出来. 地址:http://acm.hdu.edu.cn/showproblem.php?pid=5446 中国剩余定理 在<孙子算经>中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”.具体解法分三步: 1.找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找

hdu 5446 Unknown Treasure lucas和CRT

Unknown Treasure Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5446 Description On the way to the next secret treasure hiding place, the mathematician discovered a cave unknown to the map. The mathematician ent

HDU 5446 Unknown Treasure

Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 721    Accepted Submission(s): 251 Problem Description On the way to the next secret treasure hiding place, the mathematician d

hdu 5446 Unknown Treasure 卢卡斯+中国剩余定理

Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description On the way to the next secret treasure hiding place, the mathematician discovered a cave unknown to the map. The mathematician

HDU 6446 Unknown Treasure Lucas+中国剩余定理+按位乘

HDU 6446 Unknown Treasure 题意:求C(n, m) %(p[1] * p[2] ··· p[k])     0< n,m < 1018 思路:这题基本上算是模版题了,Lucas定理求C(n,m),再用中国剩余定理合并模方程,因为LL相乘会越界,所以用到按位乘. 1 #include <iostream> 2 #include <cstdio> 3 #include <fstream> 4 #include <algorithm&

hdu 5446 Unknown Treasure Lucas定理+中国剩余定理

Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2209    Accepted Submission(s): 821 Problem Description On the way to the next secret treasure hiding place, the mathematician

Unknown Treasure (卢卡斯 + 孙子定理, 模板题)

Unknown Treasure 参考链接 : https://www.cnblogs.com/linyujun/p/5199684.html 卢卡斯定理 : C(n, m) % p  =  C(n / p, m / p) * C(n%p, m%p) % p: 孙子定理 : https://blog.csdn.net/yskyskyer123/article/details/49032227 先用卢卡斯求出每个素数对大组合数的取模, 再用孙子定理将他们合并: #include<cstdio>

ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)

Problem Description On the way to the next secret treasure hiding place, the mathematician discovered a cave unknown to the map. The mathematician entered the cave because it is there. Somewhere deep in the cave, she found a treasure chest with a com

HDU 5446 Unknown Treasure(Lucas定理+CRT)

[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5446 [题目大意] 给出一个合数M的每一个质因子,同时给出n,m,求C(n,m)%M. [题解] 首先我们可以用Lucas定理求出对答案对每个质因子的模,然后我们发现只要求解这个同余方程组就可以得到答案,所以我们用中国剩余定理解决剩下的问题. [代码] #include <cstdio> #include <cstring> #include <algorithm> u