/* -*- coding: utf-8 -*- * * 1451.cc: No.1451 集団登校 - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 100000; const int MAX_M = 100000; const int MAX_GN = MAX_N + MAX_M; const int MOD = 1000000007; /* typedef */ typedef long long ll; typedef vector vi; struct UFT { int links[MAX_N], ranks[MAX_N], sizes[MAX_N]; UFT() {} void init(int n) { for (int i = 0; i < n; i++) links[i] = i, ranks[i] = sizes[i] = 1; } int root(int i) { int i0 = i; while (links[i0] != i0) i0 = links[i0]; return (links[i] = i0); } int rank(int i) { return ranks[root(i)]; } int size(int i) { return sizes[root(i)]; } bool same(int i, int j) { return root(i) == root(j); } int merge(int i0, int i1) { int r0 = root(i0), r1 = root(i1), mr; if (r0 == r1) return r0; if (ranks[r0] == ranks[r1]) { links[r1] = r0; sizes[r0] += sizes[r1]; ranks[r0]++; mr = r0; } else if (ranks[r0] > ranks[r1]) { links[r1] = r0; sizes[r0] += sizes[r1]; mr = r0; } else { links[r0] = r1; sizes[r1] += sizes[r0]; mr = r1; } return mr; } }; /* global variables */ UFT uft; int grts[MAX_N], gszs[MAX_GN], ps[MAX_GN]; vi nbrs[MAX_GN]; int ls[MAX_GN], rs[MAX_GN], cis[MAX_GN]; int zs[MAX_N + 1], es[MAX_N + 1]; /* subroutines */ int powmod(int a, int n) { // a^n % MOD int pm = 1; while (n > 0) { if (n & 1) pm = (ll)pm * a % MOD; a = (ll)a * a % MOD; n >>= 1; } return pm; } /* main */ int main() { int n, m; scanf("%d%d", &n, &m); uft.init(n); for (int i = 0; i < n; i++) grts[i] = i, gszs[i] = 1; int gn = n; memset(ps, -1, sizeof(ps)); for (int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); a--, b--; int ra = uft.root(a), rb = uft.root(b); if (ra != rb) { int ga = grts[ra], gb = grts[rb]; gszs[gn] = gszs[ga] + gszs[gb]; ps[ga] = ps[gb] = gn; nbrs[gn].push_back(ga); nbrs[gn].push_back(gb); int r = uft.merge(ra, rb); grts[r] = gn++; } } for (int st = 0, k = 0; st < gn; st++) if (ps[st] < 0) { for (int u = st; u >= 0;) { vi &nbru = nbrs[u]; if (cis[u] == 0) { ls[u] = k; if (u < n) k++; } if (cis[u] < nbru.size()) { int v = nbru[cis[u]++]; u = v; } else { rs[u] = k; if (! nbru.empty()) { int v0 = nbru[0], v1 = nbru[1]; if (gszs[v0] < gszs[v1]) zs[ls[v0]]++, zs[rs[v0]]--; else if (gszs[v0] > gszs[v1]) zs[ls[v1]]++, zs[rs[v1]]--; else es[ls[u]]++, es[rs[u]]--; } u = ps[u]; } } } //for (int i = 0; i < gn; i++) printf("%d: %d-%d\n", i, ls[i], rs[i]); for (int i = 0; i < n; i++) zs[i + 1] += zs[i], es[i + 1] += es[i]; int inv2 = powmod(2, MOD - 2); for (int i = 0; i < n; i++) { int v = (zs[ls[i]] > 0) ? 0 : powmod(inv2, es[ls[i]]); printf("%d\n", v); //printf("%d: z=%d, e=%d\n", i, zs[ls[i]], es[ls[i]]); } return 0; }