Submission #931808


Source Code Expand

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <sstream>
#include <set>
using namespace std;

int G[50][50] = {0};
const int mmod = 1000000007;

	int inv_mod(int a, int b) {
		if (a == 1) return b;
		int div = mmod / a + 1;
		return inv_mod((a * (long long)div) % mmod, (b * (long long)div) % mmod);
	}

vector<int> gnext[1003];
int v[1003],vtime;
int up[1003];

vector<int> bcc[1003];
int bcc_cnt;
int cut_vertex[1003];

pair<int,int> mystack[1003];
int top;

void dfs(int nod, int par) {
    up[nod] = v[nod] = ++vtime;
    for(int i = 0; i < gnext[nod].size(); i++){
        int next = gnext[nod][i];
        if(v[next] == 0) {
            mystack[top++] = make_pair(nod,next);
            dfs(next, nod);
            if(up[next] >= v[nod]) {
                do {
                    bcc[bcc_cnt].push_back(mystack[--top].second);
                } while( mystack[top] != make_pair(nod,next));
                bcc[bcc_cnt ++].push_back(nod);
                cut_vertex[nod] ++;
            }
            up[nod] = min(up[nod], up[next]);
        } else if(next != par)
            up[nod] = min(up[nod], v[next]);
    }
    if(par == -1 && cut_vertex[nod] == 1)
        cut_vertex[nod] = 0;
}

int neck(int k, int n) {
  int res = 0;
  for (int d=1; d<=n; d++) {
    if (n % d) continue;
    int phi = 1;
    for (int e=2; e<d; e++) if (__gcd(e, d) == 1) phi ++;
    for (int i=0; i<n/d; i++)
      phi = (phi * 1LL * k) % mmod;
    res = (res + phi) % mmod;
  }
  return (res * 1LL * inv_mod(n, 1)) % mmod;
}

int main()
{
  int n, m, k;
  cin >> n >> m >> k;

  for (int i=0; i<m; i++) {
    int a, b;
    cin >> a >> b;
    G[a-1][b-1] = G[b-1][a-1] = 1;
    gnext[a-1].push_back(b-1);
    gnext[b-1].push_back(a-1);
  }
  for (int i=0; i<n; i++)
    if (!up[i])
      dfs(i,-1);

//  for (int i=0; i<n; i++) printf("%d\n", cut_vertex[i]);
  int res = 1;
  for (int i=0; i<bcc_cnt; i++) {
    int sz = bcc[i].size();
    int mm = 0;
    for (int j=0; j<sz; j++)
      for (int k=j+1; k<sz; k++)
        mm += G[bcc[i][j]][bcc[i][k]];
//    printf("%d %d => ", sz, mm);
    if (sz - 1 == mm) {
      for (int j = 0; j < mm; j ++) res = (res * 1LL * k) % mmod;
    }
    else if (sz == mm) {
      res = (res * 1LL * neck(k, sz)) % mmod;
    } else {
      for (int i=1; i<=mm; i++) {
        res = (res * 1LL * (k + i - 1)) % mmod;
        res = (res * 1LL * inv_mod(i, 1)) % mmod;
//        printf("%d %d\n", k+i-1, i);
      }
    }
//    printf("%d\n", res);
  }
  cout << res << endl;
}

Submission Info

Submission Time
Task F - Painting Graphs with AtCoDeer
User ainu7
Language C++14 (GCC 5.4.1)
Score 1300
Code Size 2751 Byte
Status AC
Exec Time 3 ms
Memory 384 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1300 / 1300
Status
AC × 3
AC × 64
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 256 KB
0_001.txt AC 3 ms 256 KB
0_002.txt AC 3 ms 256 KB
1_003.txt AC 3 ms 256 KB
1_004.txt AC 3 ms 256 KB
1_005.txt AC 3 ms 256 KB
1_006.txt AC 3 ms 256 KB
1_007.txt AC 3 ms 256 KB
1_008.txt AC 3 ms 256 KB
1_009.txt AC 3 ms 256 KB
1_010.txt AC 3 ms 256 KB
1_011.txt AC 3 ms 256 KB
1_012.txt AC 3 ms 256 KB
1_013.txt AC 3 ms 256 KB
1_014.txt AC 3 ms 256 KB
1_015.txt AC 3 ms 256 KB
1_016.txt AC 3 ms 384 KB
1_017.txt AC 3 ms 256 KB
1_018.txt AC 3 ms 256 KB
1_019.txt AC 3 ms 256 KB
1_020.txt AC 3 ms 256 KB
1_021.txt AC 3 ms 256 KB
1_022.txt AC 3 ms 256 KB
1_023.txt AC 3 ms 256 KB
1_024.txt AC 3 ms 256 KB
1_025.txt AC 3 ms 256 KB
1_026.txt AC 3 ms 256 KB
1_027.txt AC 3 ms 256 KB
1_028.txt AC 3 ms 256 KB
1_029.txt AC 3 ms 256 KB
1_030.txt AC 3 ms 256 KB
1_031.txt AC 3 ms 256 KB
1_032.txt AC 3 ms 256 KB
1_033.txt AC 3 ms 256 KB
1_034.txt AC 3 ms 256 KB
1_035.txt AC 3 ms 256 KB
1_036.txt AC 3 ms 256 KB
1_037.txt AC 3 ms 256 KB
1_038.txt AC 3 ms 256 KB
1_039.txt AC 3 ms 256 KB
1_040.txt AC 3 ms 256 KB
1_041.txt AC 3 ms 256 KB
1_042.txt AC 3 ms 256 KB
1_043.txt AC 3 ms 256 KB
1_044.txt AC 3 ms 256 KB
1_045.txt AC 3 ms 256 KB
1_046.txt AC 3 ms 256 KB
1_047.txt AC 3 ms 256 KB
1_048.txt AC 3 ms 256 KB
1_049.txt AC 3 ms 256 KB
1_050.txt AC 3 ms 256 KB
1_051.txt AC 3 ms 256 KB
1_052.txt AC 3 ms 256 KB
1_053.txt AC 3 ms 256 KB
1_054.txt AC 3 ms 256 KB
1_055.txt AC 3 ms 256 KB
1_056.txt AC 3 ms 256 KB
1_057.txt AC 3 ms 256 KB
1_058.txt AC 3 ms 256 KB
1_059.txt AC 3 ms 256 KB
1_060.txt AC 3 ms 256 KB
1_061.txt AC 3 ms 256 KB
1_062.txt AC 3 ms 384 KB
1_063.txt AC 3 ms 256 KB