QOJ12602 Master Zhu and Polygons 题解

link

\(k\le 3\)。如果 \(k\ge4\) 一定无解。

首先我们考虑什么时候才会产生锐角,选择一个点为顶点,设其余两个点距离它的间隔(中间的边数)分别为 \(a,b\),那么当且仅当 \(a+b\ge \frac{n+1}{2}\) 时这个角是锐角。我们设 \(h=\frac{n-1}{2}\),那么条件转化为 \(a+b\ge h+1\)

我们考虑通过容斥来计算,我们设 \(S_i\) 为钦定 \(i\) 个锐角的方案数。

\(S_0\) 相当于随便选,等于 \(\dbinom{n}{m}\)

\(S_1\) 的计算

首先选一个点作为锐角的顶角,有 \(n\) 种选择。
设这个点两侧的间隔分别为 \(a,b\),设 \(t=a+b\ge h+1\)。那么当 \(t\) 确定时,合法的 \((a,b)\) 一共有 \(t-1\) 个。
剩下的点随便选,方案数为 \(\dbinom{n-t-1}{m-3}=\dbinom{2h-t}{m-3}\)(剩 \(n-t\) 个间隔,相当于 \(n-t-1\) 个点)。
那么 $$S_1=n\sum\limits_{t=h+1}^{n-m+2}(t-1)\binom{2h-t}{m-3}$$
化简一下,我们令 \(i=2h-t\),那么原式变为 $$n\sum\limits_{i=m-3}^{h-1}(2h-i-1)\binom{i}{m-3} = n(2h-1)\sum\limits_{i=m-3}^{h-1}\binom{i}{m-3} - n\sum\limits_{i=m-3}^{h-1}i\binom{i}{m-3}$$
根据曲棍球棒恒等式,化为

\[n(n-1)\binom{h}{m-2}-n(m-2)\binom{h+1}{m-1} \]

现在我们就可以 \(O(1)\) 求出 \(S_1\) 了。

\(S_2\) 的计算

现在我们需要钦定两个锐角,可以发现这两个锐角一定是相邻的,一定会共享一段间隔。

如果不相邻,两个角都需要至少 \(h+1\) 的空隔,\(2(h+1)=n+1>n\),矛盾。

设三段间隔分别为 \(a,b,c\),其中 \(b\) 为共享的间隔。当我们把 \(b\) 固定了以后,\(a,c\ge u=\max(1,h+1-b)\)

除了 \(a,c\) 以外还有 \(m-3\) 个间隔,它们都是正数。我们考虑把它们一共 \(m-1\) 个正数转换成非负整数,让 \(a,c\) 减去 \(u\),其余的 \(m-3\) 个正数都减去 \(1\)。处理后这些数的和为 \(n-b-2u-(m-3)\),那么分配这些数的方案数就为 \(\dbinom{(n-b-2u-m+3)+(m-1)-1}{(m-1)-1}=\dbinom{n-b-2u+1}{m-2}\)

所以 \(S_2=n\sum\limits_{b=1}^{n-m+1}\dbinom{n-b-2\max(1,h+1-b)+1}{m-2}\)

考虑怎么化简它,因为有个 \(\max\) 我们把它分成两段。

\(h+1-b\ge 1\) 时,即 \(b\le h,u=h+1-b\),这一段的答案为 \(\sum\limits_{b=1}^{h}\dbinom{b}{m-2}=\dbinom{h+1}{m-1}\)

\(h+1-b<1\) 时,即 \(b\ge h+1,u=1\),这一段答案为 \(\sum\limits_{b=h+1}^{n-m+1}\dbinom{n-b-1}{m-2}\)。令 \(j=n-b-1\),原式就为 \(\sum\limits_{j=m-2}^{n-h-2}\binom{j}{m-2}=\sum\limits_{j=m-2}^{h-1}\dbinom{j}{m-2}=\dbinom{h}{m-1}\)(曲棍球棒恒等式)。

所以 \(S_2=n(\dbinom{h+1}{m-1}+\dbinom{h}{m-1})\)

\(S_3\) 的计算

根据刚才 \(S_2\) 的结论,我们发现钦定三个锐角必须两两都相邻,这种情况只存在于三角形中,所以 \(m>3\)\(S_3=0\)

我们容斥一下,用总方案数 \(\dbinom{n}{3}\) 减去有一个钝角的方案数。

选择一个顶点共 \(n\) 种选择,两侧间隔之和 \(a+b\le h\),方案数就为 \(\frac{h(h-1)}{2}\)

所以 \(S_3=\dbinom{n}{3}-n\frac{h(h-1)}{2}\)

计算答案

现在我们反演出恰好的答案 \(E_i\)
根据二项式反演,

\(\begin{aligned}E_3 &= S_3 \\ E_2&=S_2-\dbinom{3}{2}S_3 = S_2-3S_3 \\ E_1 &=S_1-\dbinom{2}{1}S_2+\dbinom{3}{1}S_3=S_1-2S_2+3S_3 \\ E_0 &=S_0-\dbinom{1}{0}S_1+\dbinom{2}{0}S_2-\dbinom{3}{0}S_3=S_0-S_1+S_2-S_3\end{aligned}\)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+5;
const ll mod=1e9+7;
int T;ll n,m,k,ans,fac[N],inv[N];
ll qpow(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1)res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
void init(){
    fac[0]=1;
    for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%mod;
    inv[N-1]=qpow(fac[N-1],mod-2);
    for(ll i=N-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
}
ll C(ll n,ll m){
    if(n<m||n<0||m<0)return 0;
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
void solve(){
    ans=0;
    cin>>n>>m>>k;
    if(k>=4){
        cout<<"0\n";
        return;
    }
    ll h=(n-1)/2;
    ll s0=C(n,m),s1=((n*(n-1)%mod*C(h,m-2)%mod-n*(m-2)%mod*C(h+1,m-1)%mod)%mod+mod)%mod,s2=n*(C(h+1,m-1)+C(h,m-1))%mod,s3=(m==3?((C(n,3)-h*(h-1)/2%mod*n%mod)%mod+mod)%mod:0);
    ll e0=((s0-s1+s2-s3)%mod+mod)%mod,e1=((s1-2*s2%mod+3*s3%mod)%mod+mod)%mod,e2=((s2-3*s3%mod)%mod+mod)%mod,e3=s3;
    if(k==0)cout<<e0<<"\n";
    else if(k==1)cout<<e1<<"\n";
    else if(k==2)cout<<e2<<"\n";
    else cout<<e3<<"\n";
}
int main(){
    // freopen("acute.in","r",stdin);
    // freopen("acute.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>T;init();
    while(T--)solve();
    return 0;
}
posted @ 2026-08-28 16:15  cqbzcjh  阅读(3)  评论(0)    收藏  举报