博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU5446:Unknown Treasure——题解
阅读量:6866 次
发布时间:2019-06-26

本文共 1233 字,大约阅读时间需要 4 分钟。

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

参考:

预备知识:

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
#include
#include
#include
#include
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
n-m)m=n-m; ll cn=1,cm=1; for(ll i=0;i
>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。               +

 +欢迎访问我的博客:+

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

转载于:https://www.cnblogs.com/luyouqi233/p/8456874.html

你可能感兴趣的文章
Makefile有三个非常有用的变量。分别是$@,$^,$
查看>>
网络大厂和以色列研究团运用ML打造洪水预测模型
查看>>
Dart | 浅析dart中库的导入与拆分
查看>>
FFMpeg编程1 环境搭建
查看>>
SpringBoot | 第十八章:web应用开发之WebJars使用
查看>>
Web开发:我希望得到的编程学习路线图
查看>>
Hadoop Outline Part 3 (I/O - Avro)
查看>>
Ubuntu16.04下查看软件版本及安装位置
查看>>
hibernate的查询缓存 (转)
查看>>
Zend Framework 2 中,定制error 的layout
查看>>
避免linux并发导致的竞态发生
查看>>
Python学习--xml-ElementTree
查看>>
free、ps、netstat、tcpdump命令工具介绍
查看>>
正则取ip地址
查看>>
Windows不能确定用户或计算机名称(RPC服务器不可用)。组策略处理中止
查看>>
struts2.3.20中action中的validate校验
查看>>
java使用之json在前端和后台之间的转换
查看>>
vsftpd.conf全部配置参数官网详细说明
查看>>
强制取消横屏
查看>>
pip 仓库镜像地址
查看>>