hdu 多校容斥

Posted liweiggg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 多校容斥相关的知识,希望对你有一定的参考价值。

 从0-(n-1)选m个数和为k的方案数

设f[i]为有i个位置大于n的方案

f[0]=all-(f[1]∪f[2]∪f[3]。。)

=all-f[1]-f[2]..+(f[1]∩f[2])。。。

奇减偶加

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const ll maxn=1e6+5;

ll A[5*maxn],FA[5*maxn];
ll qpow(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1)
            ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
void init()
{
    ll i;
    A[0]=1;
    FA[0]=1;
    for(i=1; i<=3*maxn; i++)
        A[i]=A[i-1]*i%mod;
        FA[2*maxn]=qpow(A[2*maxn],mod-2);
        for(i=2*maxn;i>1;i--)
            FA[i-1]=FA[i]*i%mod;
}
ll cp(ll n,ll m)
{
    if(m>n)
        return 0;
    return A[n]*FA[n-m]%mod*FA[m]%mod;
}
int main()
{
    ll i,j,k,n,m,t;
    ll num,sum,ans,p;
    init();
    scanf("%I64d",&t);
    while(t--)
    {
       scanf("%I64d%I64d%I64d",&n,&m,&k);
       ans=cp(k+m-1,m-1);
       for(i=1;i<=(k/n);i++)
       {
           if(i&1)
            ans-=(cp(m,i)*cp(k-i*n+m-1,m-1)%mod);
           else
            ans+=(cp(m,i)*cp(k-i*n+m-1,m-1)%mod);
            ans=(ans+mod)%mod;
       }
       ans=ans%mod+mod;
       printf("%I64d
",ans%mod);
    }
    return 0;
}

 

以上是关于hdu 多校容斥的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6397(2018多校第8场1001) Character Encoding 容斥

2017多校第8场 HDU 6143 Killer Names 容斥,组合计数

《HDU多校第三场》

Visible Trees HDU - 2841(容斥)

杭电2018多校第四场(2018 Multi-University Training Contest 4) 1005.Problem E. Matrix from Arrays (HDU6336) -

2021牛客暑期多校训练营4 G.Product(容斥,模型转化)