Cod sursa(job #466429)

Utilizator cont_de_testeCont Teste cont_de_teste Data 26 iunie 2010 16:37:24
Problema Colorare3 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#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;
}