瑟瑟发抖。。出题靠队友。忘记加case 2a
题意:有n个人和m元钱,现在要把n元钱分给m个人,且这m个人有一些关系,上司得到一些钱,自己留下一些,剩下的分给下属,下属如果还有自己的下属就以此类推。。但是每个人至少要得到一块钱且得到的钱为整数
y大佬看到这个题后发现这些关系完全没用!这个问题其实就是把m分给n个人,每人至少1块,没有其他限制条件了,于是ans=C(n-1,m-1) 貌似0和1要特判下。。
ac代码
#include<bits/stdc++.h>
#define UP(i,l,h) for(int i=l;i<h;i++)
#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)
#define W(t) while(t)
#define MEM(a,b) memset(a,b,sizeof(a))
#define ll long long
#define INF 0x3f3f3f3f
#define MAXN 2500010
#define eps 1e-10
#define COUT(x) cout<<x<<endl
using namespace std;
const ll mod=1000000007;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
else
{
ll q=exgcd(b,a%b,y,x);
y=y-x*(a/b);
return q;
}
}
ll niyuan(ll a,ll n)
{
ll x,y;
ll d=exgcd(a,n,x,y);
if(d==1)
return (x%n+n)%n;
else
{
return -1;
}
}
int main()
{
//// freopen("C:/Users/冯斌/in.txt","r",stdin);
//// freopen("C:/Users/冯斌/o1.txt","w",stdout);
int t,ca=1;
scanf("%d",&t);
while(t--)
{
ll n,m;
scanf("%lld%lld",&n,&m);
for(int i=0; i<n; i++)
{
int s,p;
scanf("%d",&s);
for(int j=0; j<s; j++)
scanf("%d",&p);
}
if(m<n)
printf("Case #%d: 0\n",ca++);
else if(m==n)
printf("Case #%d: 1\n",ca++);
else
{
m--;
n--;
ll ans=1;
for(int i=1; i<=n; i++)
{
ans=ans*(m-i+1)%mod*niyuan(i,mod)%mod;
}
printf("Case #%d: %lld\n",ca++,ans);
}
}
return 0;
}