Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <numeric>
- #include <vector>
- using namespace std;
- typedef long long int ull;
- const int mod=1e9+7;
- ull ABS(ull n){
- if(n<0)return n+mod;
- else return n;
- }
- class disjoint{
- int *par, *rnk;
- public:
- disjoint(int);
- void niteu(int, int);
- int indf(int);
- };
- disjoint::disjoint(int n){
- par=new int[n]; rnk=new int[n];
- for(int i=0; i<n; i++)
- par[i]=i, rnk[i]=1;
- }
- int disjoint::indf(int x){
- if(x==par[x])return x;
- else return par[x]=indf(par[x]);
- }
- void disjoint::niteu(int x, int y){
- if(x!=y){
- if(rnk[x]<rnk[y])
- x=((x+y)-(y=x));
- par[y]=x;
- if(rnk[x]==rnk[y])
- rnk[x]++;
- }
- }
- ull pow(ull n, int k){
- ull a=1;
- while(k){
- if(k&1)
- a=(a*n)%mod;
- n=(n*n)%mod;
- k>>=1;
- }
- return a;
- }
- vector<int> read(int &N, int &k){
- int a, b, c;
- cin>>N>>k;
- disjoint dis(N);
- vector<int>v(N,0);
- for(int i=1; i<N; i++){
- cin>>a>>b>>c;
- a--, b--;
- if(!c){
- int x=dis.indf(a),
- y=dis.indf(b);
- dis.niteu(x,y);
- }
- }
- for(int i=0; i<N; i++)
- v[dis.indf(i)]++;
- return v;
- }
- int n, k;
- int main(){
- vector<int>v=read(n,k);
- cout<<ABS(ull(pow(n,k))-accumulate(v.begin(),v.end(),ull(0),
- [](int x, int y){
- return ((x+pow(y,k))%mod);}));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement