hdu 6397 容斥定理

题目链接:https://vjudge.net/problem/HDU-6397

思路:就k个相同的小球放m个相同的篮子有几种放法 ,隔板法,真菜,想了30分钟才想出来,然后容斥的时候被ans-=WA成傻逼

AC代码

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

#define N 230030
#define mod 998244353
using ll=long long;
long long fac[N+307];
long long inv[N+307];
int n,m,k;

long long quick_pow(long long t,long long p)
{
    long long ans=1;
    while(p)
    {
        if(p&1)
            ans=ans*t%mod;
        t=t*t%mod;
        p>>=1;
    }
    return ans%mod;
}

void init()
{
    fac[0]=1;
    fac[1]=1;
    for(int i=2;i<=N;++i)
        fac[i]=fac[i-1]*i%mod;
    inv[N]=quick_pow(fac[N],mod-2);
    for(int i=N-1;i>=0;--i)
        inv[i]=(i+1)*inv[i+1]%mod;

}

long long C(int x,int y)
{
    return fac[x]*inv[y]%mod*inv[x-y]%mod;
}

int main()
{
    init();
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d %d",&n,&m,&k);
        if(k==0)
        {
            cout<<1<<endl;
            continue;
        }
        if((ll)(n-1)*m<k)
        {
            cout<<0<<endl;
            continue;
        }
        int res=k/n;
        m--;
        long long ans=0;
        for(int i=0;i<=res;++i)
        {
            int temp=k-i*n;
            if(i&1)
                ans=(ans+mod-(((fac[m+temp]*inv[m])%mod*inv[temp])%mod*C(m+1,i))%mod)%mod;//-=被WA成傻逼
            else
                ans=((((fac[m+temp]*inv[m])%mod*inv[temp])%mod*C(m+1,i))%mod+ans)%mod;
        }
        cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36921652/article/details/82928202