组合数取模
来源:互联网 发布:手游源码一键端 编辑:程序博客网 时间:2024/05/16 15:31
求:
Cnm(modmo)
n,m,mo<109
Pi<109 (不一定为质数)
p不是质数,(〃>皿<),好恶心
根据中国剩余定理,可得:
设
当
设
很显然,只要算出每一个的
对于每一个的(X!),我们可以把它写成
在
剩下的不是
显然,这些数每一组的乘积(
然后我们又可以愉快的发现,一堆东西可以预处理(
于是。。。。。
愉快的搞定
标在这里:
#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typedef long long ll;typedef double db; ll read(ll &n){ char ch;int q=1;n=0; for(ch=getchar();(ch<'0' || ch>'9')&&(ch!='-');ch=getchar()); if(ch=='-')q=-1,ch=getchar(); for(;ch>='0' && ch<='9';ch=getchar())n=n*10+ch-48; n*=q;return n;}ll P,n,n1,n2,m,ans,mo;ll p[100][4],p1[100][15000],p0;//0 is p,1 is k,2 is P^k,3 is IEll a[10];struct qww{ll a,k;};ll exgcd(ll a,ll b,ll &x,ll &y){ if(!b){x=1,y=0;return a;} ll zhi=exgcd(b,a%b,x,y); ll t=x;x=y,y=t-a/b*y; return zhi;}ll IE(ll a,ll mo){ ll x=0,y=0; exgcd(a,mo,x,y); return (x%mo+mo)%mo;}ll ksm(ll a,ll w,ll mo){ ll ans=1; while(w) {if(w%2)(ans*=a)%=mo;(a*=a)%=mo,w>>=1;} return ans;}qww Ch(ll q,int mn){ qww ans;ans.a=1;ans.k=0;ll mo=p[mn][2]; if(q<2)return ans; ans=Ch(q/p[mn][0],mn); ans.k+=q/p[mn][0]; (ans.a*=p1[mn][q%mo]*ksm(p1[mn][mo-1],q/mo,mo)%mo)%=mo; return ans;}ll C(ll m,ll n){ ll ans=0; fo(i,1,p0) { qww x,y,z; x=Ch(m,i); y=Ch(n,i); z=Ch(m-n,i); x.k-=y.k+z.k;x.a=(x.a*IE(y.a*z.a,p[i][2]))%mo; (ans+=x.a*p[i][3]%mo*ksm(p[i][0],x.k,mo)%mo*(mo/p[i][2]))%=mo; } return ans;}int main(){ ll q,w,_; read(n),read(m),mo=q=read(P); for(int i=2;i*i<=q;i++) if(!(q%i)) { p[++p0][0]=i,p[p0][2]=1; while(!(q%i))q/=i,p[p0][1]++,p[p0][2]*=i; p[p0][3]=IE(mo/p[p0][2],p[p0][2]); p1[p0][0]=1; fo(j,1,p[p0][2]-1)p1[p0][j]=p1[p0][j-1]*((j%p[p0][0])?j:1)%p[p0][2]; } if(q>1) { p[++p0][0]=p[p0][2]=q,p[p0][1]=1,p[p0][3]=IE(mo/p[p0][2],p[p0][2]); p1[p0][0]=1; fo(j,1,p[p0][2]-1)p1[p0][j]=p1[p0][j-1]*((j%p[p0][0])?j:1)%p[p0][2]; } printf("%lld\n",C(m,n)); return 0;}
2 2
- 组合数取模
- 【组合数取模】
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- 组合数取模
- ViewPager的无限轮播
- [LeetCode]Add Digits
- 快速排序
- codeforces 631B Print Check
- HTML空格占位符
- 组合数取模
- Java中的异常链
- 排列组合
- 关于安装wamp server之后没办法访问localhost和127.0.0.1
- No_16_0324 Java基础学习第二十三天
- 寻找考场
- MFC-ListCtrl(列表控件)
- Android TagFlowLayout完全解析 一款针对Tag的布局
- 雅虎的34条军规 -前端性能优化