Pagini recente » Cod sursa (job #1324279) | Cod sursa (job #781729) | Cod sursa (job #586653) | Cod sursa (job #1801229) | Cod sursa (job #466429)
Cod sursa(job #466429)
#include <fstream>
#include <cstring>
using namespace std;
typedef struct{
int val,tata;
} arbore;
int pls,m,fculori,ok,fculori2,t,p,sol,i,n,x,k,y,fact[100002],f[100002],fii[100001];
arbore nod[100001],v;
int comb(int kapa,int nn)
{
int knf,nf;
if(nn>kapa) return 0;
if(kapa==nn) return 1;
if(ok==0)
knf=fact[kapa-nn];
else
knf=f[kapa-nn-k+n+2];
nf=fact[nn];
return (t/(knf*nf))%1000000007;
}
int main()
{
ifstream fi("colorare3.in");
ofstream fo("colorare3.out");
memset(nod,0,sizeof(nod));
fi>>n>>k;
fculori=1;
m=0;
if(k>n+1) ok=1;
for(i=1;i<=k;i++)
{
fculori=(fculori*i)%1000000007;
if((i>=k-1-n)&&(ok==1)) f[++m]=fculori;
if(i==k-1) fculori2=fculori;
if(i<=n) fact[i]=fculori;
}
nod[n].val=n;
for(i=1;i<=n-1;i++)
{
nod[i].val=i;
fi>>x>>y;
if(nod[y].tata==0) {nod[y].tata=x; fii[x]++; } else {nod[x].tata=y; fii[y]++; }
}
sol=1;
for(i=1;i<=n;i++)
{
v=nod[i];
if(fii[v.val]!=0)
{
if(v.tata!=0) { t=fculori2; pls=1; }else { t=fculori; pls=0; }
sol*=fact[fii[v.val]]*comb(k-pls,fii[v.val])%1000000007;
}
}
fo<<sol%1000000007<<"\n";
fo.close();
return 0;
}