JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症

    xiaoxiao2023-10-24  183

    233

    题目:题意:分析:代码:


    题目:

    传送门


    题意:

    给出一堆有颜色的珠子,求满足色号为 k k k的珠子的最后一个颗要在色号为 k k k的珠子的最后一颗的后面的方案数


    分析:

    对于一个长度为 l e n len len的已经拍好的珠子序列,新颜色的珠子必定有一个得放在最后,设新来的珠子有 b b b颗,那么可以进行排序的就有 b − 1 b-1 b1颗,而可以排的位置为队首以及其他珠子的后面,即 l e n + 1 len+1 len+1个位置 因为每个位置可以放若干个,所以联想到了有 n n n个球,放入 m m m个箱子中,箱子可为空的解法: C m + n − 1 m C_{m+n-1}^m Cm+n1m l e n + 1 len+1 len+1 b − 1 b-1 b1带入即可


    代码:

    #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #define LL long long #define LZX 998244353 inline LL read() { LL d=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();} return d*f; } using namespace std; LL ksm(LL x,LL y) { LL s=1; while(y) { if(y&1) (s*=x)%=LZX; (x*=x)%=LZX;y>>=1; } return s%LZX; } LL F[500005]; int main() { F[1]=1; for(LL i=2;i<=500000;i++) F[i]=F[i-1]*i%LZX; LL n=read(); if(n==1) return !printf("1"); LL len=read(),ans=1;; for(LL i=2;i<=n;i++) { LL b=read(); if(b!=1) (ans*=F[len+b-1]*ksm(F[b-1],LZX-2)%LZX*ksm(F[len],LZX-2)%LZX)%=LZX; len+=b; } cout<<ans%LZX; return 0; }
    最新回复(0)