제출 #19258

#제출 시각아이디문제언어결과실행 시간메모리
19258kaTkaHr트리 (kriii4_X)C++14
100 / 100
199 ms10300 KiB
#include <stdio.h>
#include<vector>
#include <algorithm>
#include <map>

using namespace std;

typedef long long ll;

const int MX = 200005, MM = 1000000007;

ll pw(ll A, ll B){
    ll R = 1;
    while(B){
        if( B&1 ) R = R * A % MM;
        A = A * A % MM; B /= 2;
    }
    return R;
}

ll rv(ll A){ return pw(A, MM-2); }

struct frac{
    ll A, B;
		frac(ll A):A(A), B(1){}
    frac(ll a, ll b){
        A = (a%MM+MM) % MM;
        B = (b%MM+MM) % MM;
    }
    frac(){A = 0, B = 1;}
    frac operator+ (const frac &l)const{
        return frac((A * l.B + B * l.A) % MM, B * l.B % MM);
    }
    frac operator*(const frac &l)const{
        return frac(A*l.A % MM, B*l.B % MM);
    }
    frac operator/(const frac &l)const{
        return frac(A*l.B % MM, B*l.A % MM);
    }
    frac operator- (const frac &l)const{
        return frac((A*l.B - B*l.A%MM + MM) % MM, B*l.B % MM);
    }
    ll v(){ return A * rv(B) % MM; }
};

map<int, int> label;
struct UF{
	int p[MX], cnt[MX];
	UF(){ fill(cnt, cnt+MX, 1); }
	int find(int x){ return !p[x]? x : p[x] = find(p[x]); }
	int merge(int x, int y){
		x = find(x), y = find(y);
		if( x == y ) return false;
		p[x] = y;
		cnt[y] += cnt[x];
		return true;
	}
}uf;

int main()
{
	int N, M, cnt = 0;
	scanf("%d%d", &N, &M);
	for(int i = 1; i <= M; i++){
		int A, B;
		scanf("%d%d", &A, &B);
		if( label[A] == 0 ) label[A] = ++cnt;
		if( label[B] == 0 ) label[B] = ++cnt;
		A = label[A], B = label[B];
		if( !uf.merge(A, B) ) return !printf("0");
	}
	frac ans = 1, tot = 0;
	for(int i = 1; i <= cnt; i++){
		if( i == uf.find(i) ) ans = ans * uf.cnt[i];
	}
	ans = ans * pw(N, N-M-2);
	if(M+1 == N) return !printf("1");
	printf("%lld\n", ans.v());
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...