码迷,mamicode.com
首页 > 其他好文 > 详细

CF1096E The Top Scorer 组合数 容斥

时间:2020-02-10 13:39:03      阅读:43      评论:0      收藏:0      [点我收藏+]

标签:name   多少   int   none   bit   http   def   The   容斥   

技术图片

 

 

枚举小明得到得分数为x,枚举得分为x得有i人

主要问题是求出g(s,n,up) 有多少种方案满足: s个求,n个箱子,每个箱子容量为up

技术图片

 

 

技术图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+1000;
const ll mod=998244353;

ll fac[N],inv[N];
ll fast(ll x,ll n) {
    ll ans=1;
    for(;n;n>>=1,x=x*x%mod)
        if(n&1) ans=ans*x%mod;
    return ans;
}
ll init(){
    fac[0]=fac[1]=1;
    for(int i=2;i<N;i++) fac[i]=fac[i-1]*i%mod;
    inv[N-1]=fast(fac[N-1],mod-2);
    for(int i=N-2;i>=0;i--)
        inv[i]=(inv[i+1]*(i+1))%mod;
}
ll C(ll n,ll m) {
    if(n<0||m<0||m>n) return 0;
    if(!m||m==n) return 1;
    return ((fac[n]*inv[m]%mod*inv[n-m])%mod);
}
ll g(ll s,ll n,ll up) {
    if(!n&&!s) return 1;
    ll ans=0;
    for(int i=0,t=1;i<=n;i++,t*=-1)
        ans=(ans+t*C(n,i)%mod*C(s+n-1-i*(up+1),n-1)%mod+mod)%mod;
    return ans;
}

int main() {
    init();
    int n,s,r;cin>>n>>s>>r;ll ans=0;
    for(int x=r;x<=s;x++)
        for(int i=1;i<=n;i++) if(i*x<=s) {
        ans=(ans+C(n-1,i-1)*fast(i,mod-2)%mod*g(s-i*x,n-i,x-1))%mod;
    }
    ans=ans*fast(C(s+n-1-r,n-1),mod-2)%mod;
    cout<<ans<<endl;
}
View Code

 

CF1096E The Top Scorer 组合数 容斥

标签:name   多少   int   none   bit   http   def   The   容斥   

原文地址:https://www.cnblogs.com/bxd123/p/12290554.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!