bzoj 3129 [Sdoi2013]方程 数论 容斥
来源:互联网 发布:网络龙虎概率分析软件 编辑:程序博客网 时间:2024/06/06 00:56
对于
对于
注意是正整数要转成非负,然后直接跑礼物就行啦。
#include <bits/stdc++.h>using namespace std;#define ll long long#define PA pair<int,int> int T,p,n,n1,n2,m;int ans,num;int pm[11],pn[11],a[11],v[11],phi[11],pt[11];int pre[11][11000];int qpow(int x,int y,int mod){ int ret=1; while(y) { if(y&1)ret=(ll)ret*x%mod; x=(ll)x*x%mod;y>>=1; } return ret;}PA get(int x,int tp){ if(x==0)return make_pair(1,0); int r1=qpow(pre[tp][pt[tp]-1],x/pt[tp],pt[tp]); r1=r1*pre[tp][x%pt[tp]]%pt[tp]; PA r2=get(x/pm[tp],tp); return make_pair(r1*r2.first%pt[tp],x/pm[tp]+r2.second);}int ny(int x,int tp){return qpow(x,phi[tp]-1,pt[tp]);}void exgcd(int &x,int &y,int a,int b){ if(b==0){y=0;x=1;return;} exgcd(y,x,b,a%b);y-=a/b*x;}int CRT(){ int ret=0,x,y; for(int i=1;i<=num;i++) { exgcd(x,y,p/pt[i],pt[i]); x=(x%pt[i]+pt[i])%pt[i]; ret=(ret+v[i]*x%pt[i]*(p/pt[i]))%p; } return ret;}int C(int x,int y){ for(int i=1;i<=num;i++) { PA r1=get(x,i),r2=get(y,i),r3=get(x-y,i); int t1=r1.second-r2.second-r3.second; if(t1>=pn[i])v[i]=0; else v[i]=r1.first*ny(r2.first,i)%pt[i]* ny(r3.first,i)%pt[i]*qpow(pm[i],t1,pt[i])%pt[i]; } return CRT();}int main(){ scanf("%d%d",&T,&p); for(int i=2,p1=p;i<=p1;i++) if(p1%i==0) { pm[++num]=i;pt[num]=1; while(p1%i==0) p1/=i,pn[num]++,pt[num]*=i; phi[num]=pt[num]-pt[num]/i; pre[num][0]=1; for(int j=1;j<pt[num];j++) { pre[num][j]=pre[num][j-1]; if(j%i)pre[num][j]=pre[num][j]*j%pt[num]; } } while(T--) { ans=0; scanf("%d%d%d%d",&n,&n1,&n2,&m); for(int i=1;i<=n1;i++)scanf("%d",&a[i]); for(int i=1,x;i<=n2;i++) scanf("%d",&x),m-=x; m-=n-n2; for(int i=0;i<1<<n1;i++) { int cnt=0,m1=m; for(int j=0;j<n1;j++) if(i>>j&1)cnt++,m1-=a[j+1]; if(m1<0)continue; if(cnt&1)ans=(ans-C(n+m1-1,n-1)+p)%p; else ans=(ans+C(n+m1-1,n-1))%p; } printf("%d\n",ans); } return 0;}
0 0
- bzoj 3129 [Sdoi2013]方程 数论 容斥
- bzoj 3129: [Sdoi2013]方程(容斥原理+组合数学+数论)
- bzoj 3129: [Sdoi2013]方程
- 【SDOI2013】【BZOJ 3129】方程 (转)
- 【SDOI2013】【BZOJ 3129】【JZOJ 3214】方程
- [BZOJ3129][SDOI2013]方程(扩展Lucas定理+容斥)
- BZOJ 3198([Sdoi2013]spring-Hash判重+容斥原理)
- BZOJ 3198 Sdoi2013 spring Hash+容斥原理
- bzoj 3198: [Sdoi2013]spring hash&容斥原理
- bzoj 3198: [Sdoi2013]spring (hash+容斥原理)
- bzoj 3198: [Sdoi2013]spring hash+容斥原理
- BZOJ 3129 [Sdoi2013]方程 不定方程解的个数+组合数取模
- BZOJ 3122 SDOI2013 随机数生成器 数论 EXBSGS
- 不定方程:poj 2142+poj 1091(数论+容斥)
- 【SDOI2013】方程
- BZOJ 2005 NOI2010 能量采集 数论+容斥原理
- BZOJ 1042 硬币购物 (数论 容斥)
- bzoj3198 [Sdoi2013]spring 哈希表+容斥
- Hdu 5765 Bonds(高维前缀和)
- android内置的HttpClient发送get、post请求用法
- Source Insight工具下载及介绍
- Days36VideoView&SurfaceView&Volly
- 数据立方体基本概念
- bzoj 3129 [Sdoi2013]方程 数论 容斥
- 利用c++ list类制作一个简单的文本编辑器
- POJ 2002 Squares(hash)
- 用mpg123播放https协议的URL MP3
- NYOJ - 18 - The Triangle(动态规划--数字三角形)
- string转char*
- Acm1
- HTML与CSSch5
- repeater动态创建一行或者删除一行