题意:给定
N
个老师,每个老师能够进行打分,最多
2≤N≤60
1≤M≤200
思路:设置
dp[m][i][j]
,代表当最大打分为
M
时,
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
typedef pair<double,double>pdd;
const int MOD = 1e9+7;
int dp[205][62][12005];
int main()
{
int T;
memset(dp,0,sizeof dp);
for(int m=0;m<=200;m++)for(int i=0;i<=m;i++)dp[m][1][i]=1;
for(int m=0;m<=200;m++)for(int i=2;i<=60;i++)
{
int up=0;
for(int j=0;j<=m*i;j++)
{
up+=dp[m][i-1][j];
if(up>=MOD)up%=MOD;
dp[m][i][j]+=up;
if(dp[m][i][j]>=MOD)dp[m][i][j]%=MOD;
if(j-m>=0)up-=dp[m][i-1][j-m];
while(up<0)up=(up+MOD)%MOD;
}
}
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)break;
ll ans=0;
for(int i=0;i<=m;i++)
{
ans+=(ll)n*(ll)dp[m][n-1][i*n-i]%MOD;
if(ans>=MOD)ans%=MOD;
}
printf("%lld\n",ans);
}
}