Pagini recente » Cod sursa (job #2167649) | Cod sursa (job #2770292) | Cod sursa (job #2695319) | Cod sursa (job #2324905) | Cod sursa (job #2031116)
#include<fstream>
#include<bitset>
#include<vector>
#include<algorithm>
using namespace std;
ifstream f("colorare3.in");
ofstream g("colorare3.out");
struct drum{
int a,b;
}X[100001];
int N,K;
bool n[100001];
bitset <100000001> viz;
vector < pair<int,int> > v;
void ciur(){
for(int i=2;i<=K;++i)
if(!viz[i]){
v.push_back(make_pair(i,0));
for(int j=i;j<=K;j+=i)
viz[j]=1;
}
}
void fact(int o){
int i=0,l;
while(o>1 && i<v.size()){
if(!(o%v[i].first)){
l=0;
while(!(o%v[i].first))++l,o/=v[i].first;
l=v[i].second+l;
v.erase(v.begin()+i),v.insert(v.begin()+i,make_pair(i,l));
}
++i;
}
}
void defact(int o){
int i=0,l;
while(o>1 && i<v.size()){
l=0;
if(!(o%v[i].first)){
while(!(o%v[i].first))++l,o/=v[i].first;
l=v[i].second-l;
v.erase(v.begin()+i),v.insert(v.begin()+i,make_pair(i,l));
}
++i;
}
}
long long lgput(int p,int e){
long long rez=1;
while(e)
if(e%2==1)rez*=p,--e;
else p*=p,e/=2;
return rez;
}
long long comb(int k,int n){
for(int i=k+1;i<=n;++i)
fact(i);
for(int i=2;i<=n-k;++i)
defact(i);
long long sol=1;
for(int i=0;i<v.size();++i)
if(v[i].second)
sol=(sol*lgput(v[i].first,v[i].second))%1000000007;
return sol;
for(int i=0;i<v.size();++i)
v.erase(v.begin()+i),v.insert(v.begin()+i,make_pair(i,0));
}
void dfs(int start,int k,long long &P){
n[start]=1;
int nr=k;
for(int i=1;i<N;++i)
if(!n[X[i].b] && X[i].a==start)
P=(P*comb(1,nr))%1000000007,--nr,dfs(X[i].b,nr,P);
}
bool cmp(drum Y,drum U){
if(Y.a>U.a)return false;
else if(Y.a>U.a&&Y.b>U.b)return false;
return true;
}
int main()
{
f>>N>>K;
for(int i=1;i<N;++i)f>>X[i].a>>X[i].b;
sort(X+1,X+N+1,cmp),ciur();
long long S=0;
comb(1,3);
for(int i=1;i<=N;++i)
if(!viz[i]){
long long P=1;
dfs(1,K,P);
if(P!=1){
if(S+P==1000000007)S=0;
else S+=P;
}
}
g<<S;
return 0;
}