大组合取模之:1<=n<=m<=1e6,1<=p<=1e9
- /******************************
- 大组合取模之:1<=n<=m<=1e6,1<=p<=1e9
- 使用:程序最开始调用getprime(),需要时调用C(n,m,p)
- 复杂度:O( n*log(n) )
- ******************************/
- typedef long long ll;
- #define N 210000
- int PRIME[N/];
- void getprime()
- {
- bool pmark[N+];
- memset(pmark,,sizeof(pmark));
- int pcnt=;
- PRIME[pcnt++]=;
- for(int i=;i<N+;i+=)
- {
- if(pmark[i]==)
- {
- PRIME[pcnt++]=i;
- for(int j=i;j<N+;j+=i) pmark[j]=;
- }
- }
- }
- /**************
- 快速幂模板
- 调用:Quk_Mul(a,b,mod)
- 返回:a^b%mod
- 复杂度:当mod>10^9,log(mod)*log(b),否则log(b)
- ***************/
- long long Mod_Mul(long long a,long long b,long long mod)
- {
- long long msum=;
- while(b)
- {
- if(b&) msum = (msum+a)%mod;
- b>>=;
- a = (a+a)%mod;
- }
- return msum;
- }
- long long Quk_Mul(long long a,long long b,long long mod)
- {
- bool qmflag=mod>1e9?:;
- long long qsum=;
- while(b)
- {
- if(b&) qsum = (qmflag==) ? Mod_Mul(qsum,a,mod) : (qsum*a)%mod;
- b>>=;
- a = (qmflag==) ? Mod_Mul(a,a,mod) : (a*a)%mod;
- }
- return qsum;
- }
- // 得到n! 中有多少个d因子
- int getdn(int n,int d)
- {
- int sum=;
- while(n)
- {
- sum += n/d;
- n/=d;
- }
- return sum;
- }
- ll C(int n,int m,ll p)
- {
- if(m>n) return ;
- ll sumc=;
- for(int i=;PRIME[i]<=n;i++)
- {
- int cnum = getdn(n,PRIME[i])-getdn(m,PRIME[i])-getdn(n-m,PRIME[i]);
- sumc = sumc*Quk_Mul(PRIME[i], cnum, p)%p;
- }
- return sumc;
- }
- /*
- int main() {
- getprime();
- int T;
- cin>>T;
- while(T--)
- {
- int n,m,p;
- cin>>n>>m>>p;
- cout<<C(n,m,p)<<endl;
- }
- return 0;
- }
- */
大组合取模之:1<=n<=m<=1e6,1<=p<=1e9的更多相关文章
- 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数
typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1&l ...
- 求解复数组 中模较大的N个数
//求解复数组 中模较大的N个数 void fianN_Complex(Complex outVec[], int& len, std::vector<int>& inde ...
- poj2305-Basic remains(进制转换 + 大整数取模)
进制转换 + 大整数取模一,题意: 在b进制下,求p%m,再装换成b进制输出. 其中p为b进制大数1000位以内,m为b进制数9位以内二,思路: 1,以字符串的形式输入p,m; 2,转换:字符串-&g ...
- Snowflake Snow Snowflakes(哈希,大素数取模)
Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 27277 Accepted: 7197 Description You ...
- Moodle 3.4中添加小组、大组、群
Moodle在高中应用时经常要用到年级.班级和小组,我们可以用群.大组.小组来代替. 小组设置:网站首页-->现有课程-->右上角的设置按钮-->更多-->用户-->小组 ...
- cogs 2170. 大整数取模
2170. 大整数取模 ★ 输入文件:bigint.in 输出文件:bigint.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 输入正整数n和m,输出n mo ...
- HDU 5698 大组合数取模(逆元)
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- lucas定理解决大组合数取模
LL MyPow(LL a, LL b) { LL ret = ; while (b) { ) ret = ret * a % MOD; a = a * a % MOD; b >>= ; ...
- 【BZOJ】3751: [NOIP2014]解方程【秦九韶公式】【大整数取模技巧】
3751: [NOIP2014]解方程 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4856 Solved: 983[Submit][Status ...
随机推荐
- 【TCP/IP】IP路由选择
IP层在内存中有一个路由表,当有数据要发送时.它要对该表进行一次搜索以确认转发地址.收到的数据到达IP层时,IP层会检查数据报的目的地址是否为本机IP或广播IP: 假设是.就依据IP首部协议字段的协议 ...
- 关于BufferedInputStream和BufferedOutputStream的实现原理的理解
在介绍FileInputStream和FileOutputStream的例子中,使用了一个byte数组来作为数据读入的缓冲区,以文件存取为例,硬盘存取的速度远低于内存中的数据存取速度.为了减少对硬盘的 ...
- Linux用ps命令查找进程PID再用kill命令终止进程的方法
使用linux操作系统,难免遇到一些软件"卡壳"的问题,这时就需要使用linux下强大的kill命令来结束相关进程.这在linux系统下是极其容易的事情,你只需要kill xxx即 ...
- tensorflow TensorArray 代码例子
import tensorflow as tf import numpy as np B=3 D=4 T=5 tf.reset_default_graph() xs=tf.placeholder(sh ...
- ASP.NET MVC学习---(七)Razor视图引擎语法
之前体验过razor视图引擎@符号的威力了吧~ 连我这个初学者都能感觉到确实省时省力方便快捷 简直就是居家旅行*人*货必备之物啊(这里和谐两个字~) 那么现在就开始对razor的语法进一步介绍~ 1. ...
- git学习——撤销操作
修改最后一次提交:--amend 在提交完成后发现漏掉了几个文件没有加进去,或者提交信息写错了.想要修改怎么办? 现在可以先把需要修改的信息进行修改如:git add 添加没有添加的文件,vim &l ...
- 有效的web安全信息源
杂志:hackcto ,书安 乌云知识库,91ri.org,安全脉搏(http://www.secpulse.com/) 乌云公开漏洞,乌云热点漏洞,90sec 内网渗透找90.web注入找习科, 已 ...
- Linux Java开发环境
一.旧版本JDK卸载 1.卸载系统自带JDK版本 #rpm -qa|grep gcj 查看到如下信息,如图所示: 进行卸载默认安装JDK: #rpm -e --nodeps java-1.4.2- ...
- Linux非阻塞IO(八)使用epoll重新实现非阻塞的回射服务器
本文无太多内容,主要是几个前面提到过的注意点: 一是epoll的fd需要重新装填.我们将tcp_connection_t的指针保存在数组中,所以我们以这个数组为依据,重新装填fd的监听事件. //重新 ...
- Linux非阻塞IO(三)非阻塞IO中缓冲区Buffer的实现
本文我们来实现回射服务器的Buffer. Buffer的实现 上节提到了非阻塞IO必须具备Buffer.再次将Buffer的设计描述一下: 这里必须补充一点,writeIndex指向空闲空间的 ...