标签:main read lang png 青春 lan 日常 for 复杂
今天突然考数论(雾,有点懵。。
出题人很有意思
看题的名字——$excatalan \to$扩展$Catalan$/类$Catalan$?
于是向$Catalan$数列上想
发现对于$m=0$时,\(Ans=excatalan(n,0)?\)
对于其他情况,\(Ans=excatalan(n,m)-excatalan(n,m-1)?\)
别问我,我不知道。。。。。。
我,我不知道。。。。。。
不知道。。。。。。
。。。。。。
附上考场代码。
测完发现 报负了。。。
于是进行改正
//报负
ll f[maxn<<1],inv[maxn<<1];
inline ll power(int a,int b){
ll ans=1;
for(;b;b>>=1){
if(b&1) ans=(ll)ans*a%mod;
a=(ll)a*a%mod;
}
return ans;
}
inline ll Cal(int x,int y){
if(x<y) return 0;
if(x<0||y<0) return 0;
return (ll)f[x]*inv[y]%mod*inv[x-y]%mod;
}
inline ll C(int x,int y){
return (ll)(Cal(x*2,x)-Cal(x*2,x-y-1))%mod;
}
int main(){
// freopen(File".in","r",stdin);
// freopen(File".out","w",stdout);
int n=read(),m=read();
f[0]=1;
for(int i=1;i<=n*2;i++) f[i]=f[i-1]*i%mod;
inv[n*2]=power(f[n*2],mod-2);
for(int i=n*2;i;i--) inv[i-1]=inv[i]*i%mod;
if(m==0) printf("%lld",C(n,0));
else printf("%lld",(C(n,m)-C(n,m-1)+mod)%mod);
return 0;
}
ll f[maxn<<1],inv[maxn<<1];
inline ll power(int a,int b){
ll ans=1;
for(;b;b>>=1){
if(b&1) ans=(ll)ans*a%mod;
a=(ll)a*a%mod;
}
return ans;
}
inline ll Cal(int x,int y){
if(x<y) return 0;
if(x<0||y<0) return 0;
return (ll)f[x]*inv[y]%mod*inv[x-y]%mod;
}
inline ll C(int x,int y){
return (ll)(Cal(x*2,x)-Cal(x*2,x-y-1)+mod)%mod;
}
int main(){
// freopen(File".in","r",stdin);
// freopen(File".out","w",stdout);
int n=read(),m=read();
f[0]=1;
for(int i=1;i<=n*2;i++) f[i]=f[i-1]*i%mod;
inv[n*2]=power(f[n*2],mod-2);
for(int i=n*2;i;i--) inv[i-1]=inv[i]*i%mod;
if(m==0) printf("%lld",C(n,0));
else printf("%lld",(C(n,m)-C(n,m-1)+mod)%mod);
return 0;
}
思考题答案:蘑菇的拟态日常
这道题让求了个 期望混乱度,cb不会期望$QAQ$。
于是我打了个随机化,输出了样例。。。
设 $f[i]$代表以 $a[i]$为终点,上一个数大于 $a[i]$的方案数。$g[i]$代表上个数 小于 $a[i]$的方案数。转移时先按 $a[i]$从小到大枚举 \(i\),再按 $a[j]$从大到小枚举 \(j\), 若$j \lt i$ ,用$f[j]$更新$g[i]$,否则用$g[i]$更新$f[j]$。
时间复杂度$O(n^2)$,空间为$O(n)$。
然后,就没了
int n,mod,ans;
int f[maxn],g[maxn];
int a[maxn],b[maxn];
inline void change(int &x,int y){
x+=y;
if(x>=mod) x-=mod;
}
int main(){
// freopen(File".in","r",stdin);
// freopen(File".out","w",stdout);
n=read(); mod=read();
for(int i=1;i<=n;i++){
a[i]=read();
b[a[i]]=i;
}
//mem(f,1); mem(g,0);//不知道为什么,我宏定义的memset挂了。。。
for(int i=1;i<=n;i++) f[i]=1,g[i]=0;
for(int i=1;i<=n;i++)
for(int j=i-1;j;j--)
if(b[j]<b[i]) change(f[i],g[j]);
else change(g[j],f[i]);
for(int i=1;i<=n;i++) change(ans,f[i]);
//mem(f,0); mem(g,1);
for(int i=1;i<=n;i++) f[i]=0,g[i]=1;
for(int i=1;i<=n;i++)
for(int j=i-1;j;j--)
if(b[j]<b[i]) change(f[i],g[j]);
else change(g[j],f[i]);
for(int i=1;i<=n;i++) change(ans,g[i]);
change(ans,mod-n%mod);
printf("%d",ans);
return 0;
}
标签:main read lang png 青春 lan 日常 for 复杂
原文地址:https://www.cnblogs.com/cbyyc/p/11682222.html