[ 数论 ] Codeforces896D
来源:互联网 发布:php常用面试题 编辑:程序博客网 时间:2024/06/15 13:51
枚举VIP的个数
用类似求卡特兰数的方法可以得出答案为
即
预处理组合数时可以先将所有项除以其与
时间复杂度
#include<bits/stdc++.h>using namespace std;#define N 100010#define M 33int i,j,k,n,m,p;int a[M],c[N][M];int fac[N],inv[N];int l,r,L,R,len,Ans;inline int Pow(int x,int y){ int Ans=1; for(;y;y>>=1,x=1ll*x*x%p)if(y&1)Ans=1ll*Ans*x%p; return Ans;}inline void Init(){ int t=p; for(int i=2;i*i<=t;i++) if(!(t%i)){ a[++m]=i;t/=i; while(!(t%i))t/=i; } if(t>1)a[++m]=t; int phi=p; for(int i=1;i<=m;i++)phi=phi/a[i]*(a[i]-1); fac[0]=inv[0]=1; for(int i=1;i<N;i++){ int x=i; for(int j=1;j<=m;j++){ c[i][j]=c[i-1][j]; while(!(x%a[j]))x/=a[j],c[i][j]++; } fac[i]=1ll*fac[i-1]*x%p; inv[i]=Pow(fac[i],phi-1); }}inline int Calc(int x,int y){ if(x<y)return 0; if(!y)return 1; int Ans=1ll*fac[x]*inv[y]%p*inv[x-y]%p; for(int i=1;i<=m;i++)Ans=1ll*Ans*Pow(a[i],c[x][i]-c[y][i]-c[x-y][i])%p; return Ans;}int main(){ scanf("%d%d%d%d",&n,&p,&l,&r); Init(); for(i=0;i<=n;i++)len=n-i,Ans=(Ans+1ll*(Calc(len,l+len+1>>1)-Calc(len,(min(r,len)+len>>1)+1))*Calc(n,i))%p; if(Ans<0)Ans+=p; cout<<Ans<<endl; return 0;}
阅读全文
0 0
- [ 数论 ] Codeforces896D
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论 ?
- 数论
- 数论
- 数论
- 数论
- 数论
- SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
- LibQQt系列之三《Multi Link技术》
- 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开
- 新增图文素材
- Codeforces Round #449 (Div. 2) C. Nephren gives a riddle 递归
- [ 数论 ] Codeforces896D
- mysql免安装版初始化
- HDOJ1325
- LibQQt系列之四《一个应用案例》
- Atitit r2017 ra doc list on home ntpc.docx
- 1290转换为小写
- JavaScript中typeof,instanceof,hasOwnProperty,in的用法和区别
- 稳压电源 连载9:简单稳压电源3-有采样放大的稳压;
- VMware vSphere ESXi6.0常用命令