Pagini recente » Borderou de evaluare (job #201790) | Cod sursa (job #466243)
Cod sursa(job #466243)
#include <iostream>
#include <queue>
using namespace std;
#define nmax 100010
#define mod 1000000007
#define maxbuf 65536
#define LL long long
#define PB push_back
char buff[maxbuf];
int N, K, viz[nmax], deg[nmax];
int M[nmax], pos[nmax], start[nmax], finish[nmax], deq[nmax];
long long fact[nmax];
long long sol;
vector<int> G[nmax];
void preproc() {
fact[0] = 1;
fact[1] = (K - 1) % mod;
for(int i=2; i<=N; i++) {
fact[i] = (LL)fact[i-1]*(K - i);
while(fact[i] >= mod) fact[i] -= mod;
}
}
void DetArbore(int nod) {
int i, p, q;
queue<int> Q;
viz[nod]=1;
Q.push(nod);
while(!Q.empty()) {
p=Q.front(); Q.pop();
for(i=start[p]; i<=finish[p]; i++) {
if(!viz[ M[i] ]) {
viz[ M[i] ]=1;
deg[p]++;
Q.push( M[i] );
}
}
}
}
int main() {
FILE *f1=fopen("colorare3.in", "r"), *f2=fopen("colorare3.out", "w");
int i, x1 = 0, y1 = 0, p, q;
fscanf(f1, "%d %d\n", &N, &K);
preproc();
for(i=1; i<N; i++) {
fscanf(f1, "%d %d\n", &p, &q);
deq[p]++; deq[q]++;
}
start[1]=1; finish[1]=deq[1];
for(i=2; i<=N; i++) {
start[i]=finish[i-1]+1;
finish[i]=start[i]+deq[i]-1;
}
FILE *f3=fopen("colorare3.in", "r");
fscanf(f3, "%d %d\n", &N, &K);
for(i=1; i<N; i++) {
fscanf(f3, "%d %d\n", &p, &q);
M[start[p]+pos[p]]=q; pos[p]++;
M[start[q]+pos[q]]=p; pos[q]++;
}
fclose(f3);
DetArbore(1);
sol = 1;
p = deg[1];
long long x = ((LL)fact[p-1] * K) % mod;
sol = ((LL)sol*x) % mod;
for(i=2; i<=N; i++) {
if(deg[i]) {
int p = deg[i];
sol = ((LL)sol*fact[p]) % mod;
}
}
fprintf(f2, "%lld\n", sol);
fclose(f1); fclose(f2);
return 0;
}