过不了样例求调
查看原帖
过不了样例求调
538159
Ryan_Adam楼主2024/10/8 09:07
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=105;
int dp[N][N*N],dp2[N][N*N];
int len[N],len2[N];
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(1)
    {
        memset(dp, 0, sizeof(dp));
		memset(dp2, 0, sizeof(dp2));
        int n,k;
        cin>>n>>k;
        if(!n&&!k)return 0;
        int res=1;
        for(int i=1;i<=n;i+=2)
            len[res++]=len[n-res]=i;
        res=res*2-3;
        sort(len+1,len+res+1);

        // for(int i=1;i<=res;i++)
        //     cout<<len[i]<<" ";
        // cout<<endl;

        for(int i=0;i<=res;i++)
            dp[i][0]=1;
        for(int i=1;i<=res;i++)
        {
            for(int j=1;j<=k;j++)
            {
                if(j>len[i])continue;
                dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*(len[i]-j+1);  
            }
        }

        int res2=1;
        for(int i=2;i<=n;i+=2)
            len2[res2++]=len2[n-res2]=i;

        res2=res2*2-3;
        sort(len2+1,len2+res2+1);
        // for(int i=1;i<=res2;i++)
        //     cout<<len2[i]<<" ";
        // cout<<endl;

        for(int i=0;i<=res2;i++)
            dp2[i][0]=1;
        for(int i=1;i<=res2;i++)
        {
            for(int j=1;j<=k;j++)
            {
                if(j>len2[i])continue;
                dp2[i][j]=dp2[i-1][j]+dp2[i-1][j-1]*(len2[i]-j+1);  
            }
        }

        int ans=0;
        for(int i=0;i<=k;i++)
            ans+=(dp[res][i]*dp2[res2][k-i]);
        cout<<ans<<endl;
    }
    return 0;
}
2024/10/8 09:07
加载中...