HDU6397 Character Encoding

HDU6397

懒得搬题了

思路:

简单容斥+插板法

\[{m+k-1\choose m-1}+\sum_{i=1}^m(-1)^i{m+k-ni-1\choose m-1}{m\choose i} \]

\(\mathfrak{Talk\ is\ cheap,show\ you\ the\ code.}\)

#include<map>
#include<cmath>
#include<stack>
#include<deque>
#include<queue>
#include<cstdio>
#include<vector>
#include<climits>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
# define Type template<typename T>
# define ll long long
# define read read1<ll>()
Type T read1(){
    T t=0;char k;
    bool v=0;
    do (k=getchar())=='-'&&(v=1);while('0'>k||k>'9');
    while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
    return v?-t:t;
}
ll qkpow(ll n,ll x,ll mo){
    if(!x)return 1;
    ll t=qkpow(n,x>>1,mo);
    t=t*t%mo;
    if(x&1)t=t*n%mo;
    return t;
}
# define mod 998244353ll
# define N 200000
ll fac[N|3],inv[N|3];
void init(){
    fac[0]=1;
    for(int i=1;i<=N;++i)
        fac[i]=fac[i-1]*i%mod;
    inv[N]=qkpow(fac[N],mod-2,mod);
    for(int i=N;i;--i)
        inv[i-1]=inv[i]*i%mod;
}
ll Ch(ll m,ll n){
    if(m<n)return 0;
    return fac[m]*inv[m-n]%mod*inv[n]%mod;
}
ll invi(ll x){return qkpow(x,mod-2,mod);}
int main(){
    init();
    for(int T=read;T--;){
        int n=read,m=read,k=read;
        ll ans=Ch(m+k-1,m-1);
        for(int i=1;i<=m;++i){
            ans=(ans+(i&1?-1:1)*Ch(m,i)*Ch(k-1ll*n*i+m-1,m-1))%mod;
        }
        cout<<(ans+mod)%mod<<endl;
    }
    return 0;
}  
posted @ 2020-09-07 10:41  ファイナル  阅读(154)  评论(0)    收藏  举报