Cod sursa(job #466357)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 26 iunie 2010 13:14:35
Problema Colorare3 Scor 40
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.25 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define nmax 100010

vector <int> g[nmax];
long long sol,X;
int v[nmax],  n, k;

int perm(int n, int k)
{
    long long p=1;
    while (k--)
    {
        p=p*n;
        p=p-p/X*X;
        n--;
    }
    return p;
}

void bfs(int nod)
{
    int i, c=0, d=0, u[nmax];
    for (i=0; i<=n; i++) u[i]=0;
    for (i=0; i<g[nod].size(); i++)
    {
        if (v[g[nod][i]]==1) c++; else
        {
            d++;
            v[g[nod][i]]=1;
            u[g[nod][i]]=1;
        }
    }
    int t=perm(k-c,d);
    sol=sol*t;
    sol=sol-sol/X*X;
    for (i=0; i<g[nod].size(); i++)
        if (u[g[nod][i]]==1)
            bfs(g[nod][i]);
}

int main()
{
    freopen("colorare3.in","r",stdin);
    freopen("colorare3.out","w",stdout);
    scanf("%d %d\n",&n,&k);
    int i, x, y, l, j;
    X=1000000007;
    char s[20];
    for (i=1; i<n; i++)
    {
        fgets(s,18,stdin);
        l=strlen(s);
        x=y=0;
        for (j=0; s[j]!=' '; j++) x=x*10+s[j]-'0';
        for (j++; s[j]>='0'&& s[j]<='9'; j++) y=y*10+s[j]-'0';
        g[x].push_back(y);
        g[y].push_back(x);
    }
    v[1]=1;
    sol=1;
    bfs(1);
    printf("%lld",sol);
}