Cod sursa(job #2031116)

Utilizator andreiutu111Noroc Andrei Mihail andreiutu111 Data 2 octombrie 2017 19:11:36
Problema Colorare3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#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;
}