4-cycle (Hard)

시간 제한2초메모리 제한1024 MB

요약
단순 무방향 그래프에서 길이가 4인 서로 다른 단순 사이클의 개수를 10^9+7로 나눈 나머지를 구한다.
난이도

어려움10점 중 8점

유형
그래프, 조합론, 해시맵, 수학
정답자
아직 제출이 없습니다

문제

NN개의 정점과 MM개의 무방향 간선으로 이루어진 단순 그래프 GG가 주어진다. 단순 그래프란, 두 정점 사이에는 최대 11개의 간선이 존재하고, 모든 간선이 서로 다른 두 정점을 연결하는 그래프이다. GG의 정점들은 NN 이하의 양의 정수들로 번호가 매겨져 있다.

그래프 GG의 길이가 LL인 단순 사이클은 다음 조건을 만족하는 정점의 수열 (v_0,v_1,⋯ ,v_L)\left( v\_0,v\_1,\cdots ,v\_L \right)로 정의된다.

  • 모든 0≤i\<L0\leq i\<L인 ii에 대해 v_iv\_i와 v_i+1v\_{i+1}을 연결하는 간선이 GG에 존재한다.
  • 모든 0≤i\<j\<L0\leq i\<j\<L인 i,ji,j에 대해 v_i≠v_jv\_i\neq v\_j를 만족하고, v_L=v_0v\_L=v\_0이다.

이때, 두 단순 사이클이 다음의 연산을 이용해 서로 변환 가능하면, 이를 동일한 사이클로 간주한다.

  • 수열을 뒤집는다. 즉, (v_0,v_1,⋯ ,v_L)\left( v\_0,v\_1,\cdots ,v\_L \right)을 (v_L,⋯ ,v_1,v_0)\left( v\_L,\cdots ,v\_1,v\_0 \right)로 변경한다.
  • 수열의 두 번째 원소를 맨 뒤에 추가하고 첫 번째 원소를 삭제한다. 즉, (v_0,v_1,⋯ ,v_L)\left( v\_0,v\_1,\cdots ,v\_L \right)을 (v_1,⋯ ,v_L,v_1)\left( v\_1,\cdots ,v\_L,v\_1 \right)로 변경한다.

예를 들어, 단순 사이클 (1,2,3,4,1)\left( 1,2,3,4,1 \right)과 (2,1,4,3,2)\left( 2,1,4,3,2 \right)는 동일한 단순 사이클이다. 주어진 그래프 GG에서 길이가 44인 서로 다른 단순 사이클의 개수를 구해보자.

입력

첫 번째 줄에 그래프 GG의 정점의 개수 N(2≤N≤105)N(2\leq N\leq 10^5)과 간선의 개수 M(1≤M≤105)M(1\leq M\leq 10^5)이 공백으로 구분되어 주어진다.

두 번째 줄부터 MM줄에 걸쳐 그래프 GG의 간선을 이루는 서로 다른 두 정점 u,v(1≤u,v≤N)u,v(1\leq u,v\leq N)가 공백으로 구분되어 주어진다.

간선이 중복으로 들어오지 않음이 보장된다.

출력

그래프 GG에서 길이가 44인 서로 다른 단순 사이클의 개수를 109+710^9+7로 나눈 나머지를 출력한다.

단, 109+710^9+7은 소수이다.

예제3

  1. 예제 1

    입력
    6 7
    1 2
    2 3
    3 4
    4 1
    4 5
    5 6
    6 4
    
    예상 출력
    1
    
  2. 예제 2

    입력
    4 6
    1 2
    1 3
    1 4
    2 3
    2 4
    3 4
    
    예상 출력
    3
    
  3. 예제 3

    입력
    6 15
    1 2
    1 3
    1 4
    1 5
    1 6
    2 3
    2 4
    2 5
    2 6
    3 4
    3 5
    3 6
    4 5
    4 6
    5 6
    
    예상 출력
    45