Submission #950547
Source Code Expand
#include <iostream> #include <vector> #include <set> #include <stack> #include <functional> using namespace std; const int MOD = 1000000007; struct Edge { Edge(int src, int dst) : src(src), dst(dst) {} int src, dst; int getMin() const { return min(src, dst); } int getMax() const { return max(src, dst); } bool operator < (const Edge& e) const { if(getMin() == e.getMin()){ return getMax() < e.getMax(); } return getMin() < e.getMin(); } }; int gcd(int a, int b){ return a%b ? gcd(b, a%b) : b; } vector< set<Edge> > findArt(const vector< vector<int> >& g){ const int n = g.size(); vector<int> order(n, -1), low(n, -1); vector< set<Edge> > comp; stack<Edge> edges; int time = 0; function<void(int)> f = [&](int v){ order[v] = low[v] = time; ++time; for(int i=0;i<g[v].size();i++){ const int dst = g[v][i]; if(order[dst] < order[v]) edges.push(Edge(v, dst)); if(order[dst] == -1){ f(dst); low[v] = min(low[v], low[dst]); if(order[v] <= low[dst]){ comp.push_back(set<Edge>()); while(true){ Edge e = edges.top(); edges.pop(); comp.back().insert(e); if(e.src == v && e.dst == dst) break; } } } else { low[v] = min(low[v], order[dst]); } } }; for(int i=0;i<n;i++){ if(order[i] != -1) continue; time = 0; f(i); } return comp; } long long modPow(long long a, long long p){ if(p == 0) return 1; long long r = modPow(a, p/2); r = r*r%MOD; if(p%2 == 1) r = r*a%MOD; return r; } int main(){ int N, M, K; long long comb[201][202]; for(int i=1;i<=200;i++){ comb[i][0] = 1; for(int j=1;j<i;j++){ comb[i][j] = comb[i-1][j-1] + comb[i-1][j]; comb[i][j] %= MOD; } comb[i][i] = 1; } while(cin >> N >> M >> K){ vector< vector<int> > g(N); for(int i=0;i<M;i++){ int a, b; cin >> a >> b; --a; --b; g[a].push_back(b); g[b].push_back(a); } vector< set<Edge> > c = findArt(g); long long res = 1; for(int i=0;i<c.size();i++){ const set<Edge>& v = c[i]; if(v.size() == 1){ res *= K; res %= MOD; continue; } set<int> S; for(const Edge& e : v){ S.insert(e.src); S.insert(e.dst); } if(S.size() == v.size()){ long long add = 0; for(int j=1;j<=S.size();j++){ add += modPow(K, gcd(j, S.size())); add %= MOD; } add *= modPow(S.size(), MOD-2); add %= MOD; res *= add; res %= MOD; } else { res *= comb[v.size()+K-1][v.size()]; res %= MOD; } } cout << res << endl; } }
Submission Info
Submission Time | |
---|---|
Task | F - Painting Graphs with AtCoDeer |
User | pes |
Language | C++14 (GCC 5.4.1) |
Score | 1300 |
Code Size | 2620 Byte |
Status | AC |
Exec Time | 3 ms |
Memory | 640 KB |
Judge Result
Set Name | Sample | All | ||||
---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 1300 / 1300 | ||||
Status |
|
|
Set Name | Test Cases |
---|---|
Sample | 0_000.txt, 0_001.txt, 0_002.txt |
All | 0_000.txt, 0_001.txt, 0_002.txt, 1_003.txt, 1_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt, 1_033.txt, 1_034.txt, 1_035.txt, 1_036.txt, 1_037.txt, 1_038.txt, 1_039.txt, 1_040.txt, 1_041.txt, 1_042.txt, 1_043.txt, 1_044.txt, 1_045.txt, 1_046.txt, 1_047.txt, 1_048.txt, 1_049.txt, 1_050.txt, 1_051.txt, 1_052.txt, 1_053.txt, 1_054.txt, 1_055.txt, 1_056.txt, 1_057.txt, 1_058.txt, 1_059.txt, 1_060.txt, 1_061.txt, 1_062.txt, 1_063.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
0_000.txt | AC | 3 ms | 512 KB |
0_001.txt | AC | 3 ms | 512 KB |
0_002.txt | AC | 3 ms | 512 KB |
1_003.txt | AC | 3 ms | 512 KB |
1_004.txt | AC | 3 ms | 512 KB |
1_005.txt | AC | 3 ms | 512 KB |
1_006.txt | AC | 3 ms | 640 KB |
1_007.txt | AC | 3 ms | 512 KB |
1_008.txt | AC | 3 ms | 512 KB |
1_009.txt | AC | 3 ms | 512 KB |
1_010.txt | AC | 3 ms | 512 KB |
1_011.txt | AC | 3 ms | 512 KB |
1_012.txt | AC | 3 ms | 512 KB |
1_013.txt | AC | 3 ms | 640 KB |
1_014.txt | AC | 3 ms | 512 KB |
1_015.txt | AC | 3 ms | 512 KB |
1_016.txt | AC | 3 ms | 512 KB |
1_017.txt | AC | 3 ms | 512 KB |
1_018.txt | AC | 3 ms | 512 KB |
1_019.txt | AC | 3 ms | 512 KB |
1_020.txt | AC | 3 ms | 512 KB |
1_021.txt | AC | 3 ms | 512 KB |
1_022.txt | AC | 3 ms | 512 KB |
1_023.txt | AC | 3 ms | 512 KB |
1_024.txt | AC | 3 ms | 512 KB |
1_025.txt | AC | 3 ms | 512 KB |
1_026.txt | AC | 3 ms | 512 KB |
1_027.txt | AC | 3 ms | 640 KB |
1_028.txt | AC | 3 ms | 512 KB |
1_029.txt | AC | 3 ms | 512 KB |
1_030.txt | AC | 3 ms | 640 KB |
1_031.txt | AC | 3 ms | 512 KB |
1_032.txt | AC | 3 ms | 512 KB |
1_033.txt | AC | 3 ms | 512 KB |
1_034.txt | AC | 3 ms | 512 KB |
1_035.txt | AC | 3 ms | 512 KB |
1_036.txt | AC | 3 ms | 512 KB |
1_037.txt | AC | 3 ms | 512 KB |
1_038.txt | AC | 3 ms | 512 KB |
1_039.txt | AC | 3 ms | 512 KB |
1_040.txt | AC | 3 ms | 512 KB |
1_041.txt | AC | 3 ms | 512 KB |
1_042.txt | AC | 3 ms | 512 KB |
1_043.txt | AC | 3 ms | 512 KB |
1_044.txt | AC | 3 ms | 512 KB |
1_045.txt | AC | 3 ms | 512 KB |
1_046.txt | AC | 3 ms | 512 KB |
1_047.txt | AC | 3 ms | 512 KB |
1_048.txt | AC | 3 ms | 512 KB |
1_049.txt | AC | 3 ms | 512 KB |
1_050.txt | AC | 3 ms | 512 KB |
1_051.txt | AC | 3 ms | 512 KB |
1_052.txt | AC | 3 ms | 512 KB |
1_053.txt | AC | 3 ms | 512 KB |
1_054.txt | AC | 3 ms | 512 KB |
1_055.txt | AC | 3 ms | 512 KB |
1_056.txt | AC | 3 ms | 512 KB |
1_057.txt | AC | 3 ms | 512 KB |
1_058.txt | AC | 3 ms | 512 KB |
1_059.txt | AC | 3 ms | 512 KB |
1_060.txt | AC | 3 ms | 512 KB |
1_061.txt | AC | 3 ms | 512 KB |
1_062.txt | AC | 3 ms | 512 KB |
1_063.txt | AC | 3 ms | 512 KB |