Kyung Hee Univ. 2025 Spring Programming Contest (KHSPC 2025)
Условие недоступно на русском языке
A. 태권도와 복싱을 합한 운동
time limit per test
1 second
memory limit per test
1024 megabytes
input
standard input
output
standard output
태보권도와 싱을 합한 운동입니다!
— TAE BO DIET, 2003

쿠옹이는 태보를 보고, 이런 생각이 들었다. '태권도와 복싱을 합해서 태보면 양궁과 파워리프팅을 합하면 양파인가? 나도 운동 하나 만들어 볼까?'

운동 AB의 이름을 합치면 A의 첫음절과 B의 첫음절을 이어 붙인 이름의 새로운 운동이 만들어진다. 만약 둘 중 하나라도 첫음절이 존재하지 않는다면 새로운 운동의 이름을 만들 수 없다.

문자열의 첫음절이란 문자열의 첫 번째 모음을 포함하고 그다음 나오는 첫 번째 자음을 포함하지 않는 접두사 중 가장 긴 접두사이다. 만약 모음이 없거나 첫 번째 모음 이후 자음이 없다면 첫음절은 존재하지 않는다. 다음은 여러 문자열의 첫음절의 예시이다.

  • taekwondo tae
  • boxing bo
  • tae는 모음이 없어 첫음절이 존재하지 않는다.
  • ski는 모음은 있지만 첫 모음 이후 자음이 없어 첫음절이 존재하지 않는다.

모음은 a, e, i, o, u의 5가지 문자를 말하며, 자음은 이 5가지를 제외한 모든 문자를 말한다.

쿠옹이가 새롭게 만들 운동의 이름을 출력해 보자.

Input

첫째 줄에 운동 A의 이름 SA(1 ≤ |SA| ≤ 100)이 주어진다.

둘째 줄에 운동 B의 이름 SB(1 ≤ |SB| ≤ 100)이 주어진다.

운동의 이름은 모두 영어 알파벳 소문자만으로 구성되어 있다.

Output

운동 A와 운동 B의 이름을 합한 새로운 운동의 이름을 출력하라.

만약 주어진 규칙에 따라 운동의 이름을 만들 수 없다면, 대신 no such exercise를 출력하라.

Examples
Input
taekwondo
boxing
Output
taebo
Input
swimming
racing
Output
swira
Input
mtb
running
Output
no such exercise
Input
archery
powerlifting
Output
apo

Условие недоступно на русском языке
B. 3단 가시
time limit per test
2 seconds
memory limit per test
1024 megabytes
input
standard input
output
standard output

쿠옹이는 큐브가 가시를 뛰어넘는 게임을 하고 있다.

이 게임의 모든 맵에서 큐브는 위치 0에서 출발하여 매 프레임 1만큼 이동한다. 큐브가 위치 N에 도달한다면 공중에 떠 있는 상태인지와 관계없이 맵을 클리어하게 된다.

큐브는 프레임마다 공중에 떠 있는 상태가 아니라면 점프할 수 있다. 큐브가 점프하면 점프한 다음 프레임부터 3프레임 동안 공중에 떠 있는 상태가 된다. 예를 들어 1프레임에 점프를 하면 2프레임부터 4프레임까지는 공중에 떠 있는 상태이다가 5프레임에 공중에 떠 있는 상태가 아니게 된다.

만약 큐브가 공중에 떠 있는 상태가 아닐 때 어떤 가시와 위치가 일치하면 큐브는 가시에 부딪혀 죽고 클리어에 실패하게 된다.

쿠옹이는 어떤 맵은 클리어가 불가능하다고 생각했다. 쿠옹이를 위해 맵의 클리어 가능성을 판별해 주자.

Input

첫째 줄에 쿠옹이가 궁금해한 맵의 개수 T(1 ≤ T ≤ 1 000)가 주어진다.

다음 줄부터 T개의 맵이 아래와 같은 형식으로 주어진다.

  • 첫째 줄에 맵의 길이 N이 주어진다. (1 ≤ N ≤ 1018)
  • 둘째 줄에 가시의 개수 X가 주어진다. (1 ≤ X ≤ min(N - 1, 1 000))
  • 셋째 줄에 각 가시의 위치 P1, P2, ..., PX가 공백으로 구분되어 주어진다. (1 ≤ P1 < P2 < ... < PX ≤ N - 1)
입력되는 모든 수는 정수이다.
Output

맵이 주어질 때마다 클리어 가능하다면 POSSIBLE, 불가능하다면 IMPOSSIBLE을 출력하라.

Example
Input
3
4
3
1 2 3
5
2
1 4
10
4
5 6 7 9
Output
POSSIBLE
IMPOSSIBLE
POSSIBLE

Условие недоступно на русском языке
C. 피자 (U+1F355 U+1F60B U+1F92E)
time limit per test
2 seconds
memory limit per test
1024 megabytes
input
standard input
output
standard output

쿠옹이는 편식을 많이 한다. 친구들은 쿠옹이의 편식을 막기 위해 쿠옹이가 좋아하는 음식인 피자 위에 다양한 재료를 올리려고 한다. 이 피자는 첫 번째 조각과 마지막 조각이 연속되어 있는 원 모양이다.

쿠옹이의 피자의 선호도는 연속된 피자 조각의 피자 조각의 선호도의 합의 최댓값이다. 또한 피자 조각의 선호도는 그 피자 조각 위에 올라가 있는 재료의 재료의 선호도의 합과 같다. 아무 재료도 올라가 있지 않은 피자 조각의 선호도는 0이다.

아무 피자 조각도 선택하지 않고 피자의 선호도라고 하는 것은 이상하므로 피자의 선호도는 하나 이상의 피자 조각을 고르는 경우만을 포함한다.

최초에 피자 위에는 아무 재료도 올라가 있지 않다. 쿠옹이의 친구들은 총 Q번에 걸쳐 다음 두 행동 중 하나를 한다.

  • 1 a b: a(1 ≤ a ≤ S)번 조각 위에 재료의 선호도b( - 109 ≤ b ≤ 109)인 재료를 올린다.
  • 2: 쿠옹이에게 현재 쿠옹이의 피자의 선호도가 몇인지 질문한다.
Input

첫째 줄에 피자의 조각 수 S(1 ≤ S ≤ 200 000)와 쿠옹이의 친구들의 행동 수 Q(1 ≤ Q ≤ 500 000)가 공백으로 구분되어 주어진다.

이후 Q개의 줄에 걸쳐 행동이 주어진다.

행동 2는 적어도 한 번 이상 주어진다.

입력으로 주어지는 모든 수는 정수이다.

Output

행동 2가 주어질 때마다 쿠옹이의 피자의 선호도를 출력하라.

Example
Input
5 12
1 1 3
1 2 3
1 3 -5
2
1 5 3
2
1 4 3
2
1 4 -5
2
1 3 4
2
Output
6
9
12
9
9

Условие недоступно на русском языке
D. 쿠옹이의 궁금증
time limit per test
4 seconds
memory limit per test
1024 megabytes
input
standard input
output
standard output

쿠옹이는 어느 날 갑자기 이런 궁금증이 들었다. '연산 결과가 N이 되는 수식은 몇 개가 있을까?'

쿠옹이는 연산 결과가 N이 되는 수식의 뒤에 +0, -0 등을 이어 붙이면 여전히 연산 결과가 N이므로 이 시행을 반복하면 연산 결과가 N인 수식을 무한히 만들 수 있다는 슬픈 사실을 깨닫고 말았다.

그래서 쿠옹이는 수식의 길이가 M이어야 한다는 제약을 추가했지만 이번에는 답을 내지 못했다. 여러분이 대신 이 문제를 풀어 주자!

수식은 다음과 같이 정의된다.

  • 0, 1, 2, 3, 4, 5, 6, 7, 8, 9만으로 구성되어 있으며 0으로 시작하지 않는 길이 1 이상의 문자열이다. 단 00으로 시작하지만 예외적으로 이다.
  • 수식1개 이상의 을 포함하며 각 + 또는 -로 구분되어 있는 문자열이다.

다르게 설명하면 수식은 다음 정규식을 만족하는 문자열을 말한다.

  • (([1-9][0-9]*|'0')[+-]))*([1-9][0-9]*|'0')
Input

첫째 줄에 NM이 공백으로 구분되어 주어진다. (0 ≤ N ≤ 105, 1 ≤ M ≤ 11)

Output

길이 M의 연산 결과가 N이 되는 서로 다른 수식의 수를 출력하라. 이때 그러한 수식이 아주 많을 수 있으므로 109 + 7로 나눈 나머지를 대신 출력하라.

Examples
Input
5 3
Output
11
Input
123 3
Output
1
Input
100000 5
Output
0
Input
0 2
Output
0
Input
10 3
Output
9
Note

예제 1: 길이 3의 연산 결과가 5가 되는 수식은 0+5, 1+4, 2+3, 3+2, 4+1, 5+0, 5-0, 6-1, 7-2, 8-3, 9-411개이다.

예제 2: 수식은 +-를 포함하지 않을 수도 있다.

예제 5: 수식은 +-로 시작할 수 없다.

Условие недоступно на русском языке
E1. 간단한 동전 문제 (Easy)
time limit per test
1 second
memory limit per test
1024 megabytes
input
standard input
output
standard output

이 문제는 간단한 동전 문제 (Hard)와 NM의 제한을 제외하면 동일한 문제입니다.

쿠옹이는 경희 왕국에 살고 있다. 경희 왕국에서는 P1원, P2원, ..., PN원의 N종류의 동전을 사용한다.

신기하게도 경희 왕국에는 0 또는 음수의 가치를 가지는 동전이 있을 수 있다.

쿠옹이는 물건을 사기 위해 정확히 M원을 지불하려 한다. 물론 M0 또는 음수인 경우에도 정확히 M원을 지불해야 한다. 쿠옹이는 각 동전을 무한히 많이 가지고 있어서 정확히 M원을 지불하는 방법이 있다면 항상 지불할 수 있다.

예를 들어 50원 동전과  - 3원 동전으로 94원을 지불해야 한다면 지불해야 하는 동전의 최소 개수는 502개,  - 32개로 총 4개이다. 이보다 적은 개수의 동전으로 정확히 94원을 지불할 수는 없다.

Input

첫째 줄에 동전의 종류 N(0 ≤ N ≤ 2)과 지불할 금액 M( - 1 000 ≤ M ≤ 1 000)이 공백으로 구분되어 주어진다.

둘째 줄에 각 동전의 가치 P1, P2, ..., PN ( - 1 000 ≤ Pi ≤ 1 000)가 공백으로 구분되어 주어진다. 만약 N = 0이라면 입력에 둘째 줄은 주어지지 않는다.

입력되는 모든 수는 정수이다.

Output

M원을 지불하기 위해 필요한 동전의 최소 개수를 출력하라. 어떤 방법으로도 M원을 지불할 수 없다면  - 1을 대신 출력하라.

Examples
Input
2 94
50 -3
Output
4
Input
2 999
2 4
Output
-1
Input
1 -5
-1
Output
5
Input
0 1
Output
-1
Input
2 0
1 -1
Output
0

Условие недоступно на русском языке
E2. 간단한 동전 문제 (Hard)
time limit per test
1 second
memory limit per test
1024 megabytes
input
standard input
output
standard output

이 문제는 간단한 동전 문제 (Easy)와 NM의 제한을 제외하면 동일한 문제입니다.

쿠옹이는 경희 왕국에 살고 있다. 경희 왕국에서는 P1원, P2원, ..., PN원의 N종류의 동전을 사용한다.

신기하게도 경희 왕국에는 0 또는 음수의 가치를 가지는 동전이 있을 수 있다.

쿠옹이는 물건을 사기 위해 정확히 M원을 지불하려 한다. 물론 M0 또는 음수인 경우에도 정확히 M원을 지불해야 한다. 쿠옹이는 각 동전을 무한히 많이 가지고 있어서 정확히 M원을 지불하는 방법이 있다면 항상 지불할 수 있다.

예를 들어 50원 동전과  - 3원 동전으로 94원을 지불해야 한다면 지불해야 하는 동전의 최소 개수는 502개,  - 32개로 총 4개이다. 이보다 적은 개수의 동전으로 정확히 94원을 지불할 수는 없다.

Input

첫째 줄에 동전의 종류 N(0 ≤ N ≤ 2 000)과 지불할 금액 M( - 10 000 ≤ M ≤ 10 000)이 공백으로 구분되어 주어진다.

둘째 줄에 각 동전의 가치 P1, P2, ..., PN ( - 1 000 ≤ Pi ≤ 1 000)가 공백으로 구분되어 주어진다. 만약 N = 0이라면 입력에 둘째 줄은 주어지지 않는다.

입력되는 모든 수는 정수이다.

Output

M원을 지불하기 위해 필요한 동전의 최소 개수를 출력하라. 어떤 방법으로도 M원을 지불할 수 없다면  - 1을 대신 출력하라.

Examples
Input
2 94
50 -3
Output
4
Input
2 999
2 4
Output
-1
Input
1 -5
-1
Output
5
Input
0 1
Output
-1
Input
2 0
1 -1
Output
0

Условие недоступно на русском языке
F. 특별한 정점
time limit per test
1 second
memory limit per test
1024 megabytes
input
standard input
output
standard output

1부터 N까지 N개의 정점으로 이루어진 무방향 트리가 있다.

트리에는 특별한 정점이 있다. 트리에 간선을 추가해서 모든 특별한 정점을 한 번씩 방문하는 경로를 만들려고 한다. 이때 같은 정점을 두 번 방문해서는 안된다. 특별한 정점이 아닌 일반 정점은 경로상에 포함될 수 있지만, 모든 일반 정점을 방문할 필요는 없다.

모든 특별한 정점을 한 번씩 방문하는 경로를 만들기 위해 필요한 간선의 최소 개수를 구해보자.

Input

첫째 줄에 정점의 개수 N이 주어진다. (1 ≤ N ≤ 200 000)

둘째 줄부터 N - 1개의 줄에 걸쳐 간선이 연결하는 두 정점의 번호 u,v가 주어진다. (1 ≤ u, v ≤ N)

N + 1번째 줄에는 N개의 정수가 공백으로 구분되어 주어진다. i번째 정수가 0이면 i번 정점은 일반 정점이며, 1이면 i번 정점은 특별한 정점이다.

입력으로 주어지는 그래프는 트리이다.

Output

경로를 만들기 위해 추가해야 할 간선의 최소 개수를 출력한다.

Examples
Input
21
1 2
1 3
2 4
2 5
3 6
3 7
3 8
3 9
4 10
5 11
5 12
6 13
6 14
10 15
10 16
13 17
16 18
16 19
17 20
17 21
0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0
Output
4
Input
4
1 2
2 3
3 4
0 0 0 0
Output
0
Input
6
1 2
1 3
2 4
3 5
6 3
1 1 0 1 1 1
Output
1

Условие недоступно на русском языке
G. 부분수열 고르기
time limit per test
1 second
memory limit per test
1024 megabytes
input
standard input
output
standard output

길이가 N인 수열 A = {a1, a2, a3, ..., aN}는 초항이 a이고 공차가 d인 유한 등차수열이다.

양의 정수 M에 대하여 합이 MA의 부분 수열 중 가장 긴 것을 구하시오.

부분 수열이란 주어진 수열에서 원래 순서를 유지하며 0개 이상의 원소를 제거하여 얻은 수열이다.

Input

첫째 줄에 네 정수 N, a, d, M이 공백으로 구분되어 주어진다. (1 ≤ N, a, d ≤ 106; 1 ≤ M ≤ 1018)

Output

첫째 줄에 합이 MA의 부분 수열 중 가장 긴 것의 길이 L을 출력한다.

둘째 줄에 그러한 부분 수열의 원소 L개를 공백으로 구분하여 출력한다. 가능한 답이 여러 가지라면 그중 아무거나 출력한다.

만약 그런 부분 수열이 존재하지 않는다면 첫째 줄에 −1을 대신 출력한다.

Examples
Input
5 2 2 10
Output
2
4 6
Input
3 1 2 7
Output
-1
Note

예제 입력 1에서 주어진 수열은 A = {2, 4, 6, 8, 10}이다. 길이 조건을 제외하면 가능한 B의 후보는 {10}, {2, 8}, {4, 6}이다. 이 중 길이가 가장 긴 수열은 {2, 8}{4, 6}이므로 둘 중 아무거나 출력하면 된다.

Условие недоступно на русском языке
H. 잔돈 싫어
time limit per test
1 second
memory limit per test
1024 megabytes
input
standard input
output
standard output

jwpassion1은 사용하지 않는 오래된 교통카드 여러장을 찾아 현금으로 환불받기로 하였다. jwpassion1은 500원 동전이 필요한 리듬게임을 할 때 외에는 현금을 사용할 일이 없다. 그러나 하필 환불을 받을 금액이 500으로 나눈 나머지가 정확히 490이 되는 바람에 아무데도 쓸모 없는 동전 9개가 생겨 곤란하게 되었다. 따라서 앞으로는 불필요한 동전이 생기지 않게 주의하려고 한다.

구체적으로 아래와 같은 규칙으로 교통카드를 환불받아야 한다.

  • 잔액이 20 000원 이상인 교통카드는 환불이 불가능하다.
  • 환불 수수료는 500원이다. 즉, i번째 교통카드의 환불 금액은 정확히 Ai - 500원이 된다. 만약 Ai ≤ 500인 교통카드는 환불을 받는 것이 손해이기에 환불이 불가능하다.
  • 환불받은 금액의 합은 500으로 나누어떨어져야 한다.

jwpassion1이 가지고 있는 교통카드의 개수와 각 교통카드의 잔액이 주어질 때 환불받을 수 있는 최대 금액을 구해라.

Input

첫째 줄에 교통카드의 개수를 나타내는 음이 아닌 정수 N이 주어진다. (0 ≤ N ≤ 100 000)

둘째 줄부터 N개의 줄에 걸쳐 i번째 교통카드의 잔액 Ai이 한 줄에 하나씩 주어진다. (0 ≤ Ai ≤ 100 000; Ai10의 배수)

N0인 경우에 입력은 첫째 줄만 주어진다.

Output

환불받을 수 있는 최대 금액을 출력한다.

환불받을 수 없다면 0을 출력한다.

Examples
Input
5
1000
520
450
19500
20000
Output
19500
Input
4
600
1100
850
950
Output
1500
Input
4
990
990
990
990
Output
0
Input
0
Output
0
Note

jwpassion1은 실제로 교통카드를 환불하고 받은 490원을 가지고있다.

Условие недоступно на русском языке
I. 수열 재활용
time limit per test
2 seconds
memory limit per test
1024 megabytes
input
standard input
output
standard output

경희대학교 알고리즘 동아리 KHUA에서는 축하할 일이나 기념할 일이 있을 떄 선물로 수열을 주고받는 PS계의 문화를 본받아 신입 부원들에게 선물로 수열을 나누어 주려고 한다. 하지만 매번 새로운 수열을 만들어 내는 것은 귀찮기 때문에 수열 하나를 만들어 두고 그것을 재활용해서 새로운 수열을 만들어 내기로 했다.

재활용할 무한한 길이의 주기 수열 A1, A2, ...를 만든다. A의 첫 N개 원소는 A1, A2, ..., AN로 주어지며, i > N일 때 Ai = Ai - N이다. 이 수열의 각 원소는 0 이상 M - 1 이하의 정수이다. 1 이상 N 이하인 정수 i0 이상 M - 1 이하의 정수 j에 대해 다음과 같이 정의되는 길이 T (T ≤ N)인 수열 Bi, j1, Bi, j2, ..., Bi, jT을 선물로 나누어 주면 좋겠다고 생각했다.

Bi, jk = (Ai + k + j) modM

하지만 이렇게 만들어진 수열이 중복되면 사람들이 수열을 재활용하고 있다는 걸 알아챌 수 있으므로 이런 상황은 최대한 피하려고 한다.

재활용해 만들어낸 임의의 두 수열이 같을 확률을 구해 얼마나 수열을 재활용할 수 있을 지 예측하려고 한다. 1 ≤ i1, i2 ≤ N이고 0 ≤ j1, j2 ≤ M - 1인 정수 i1, i2, j1, j2를 균일한 확률로 무작위로 뽑았을 때 Bi1, j1Bi2, j2가 서로 같을 확률을 구해야 한다. 각 수는 독립적으로 선택되므로 (i1, j1) = (i2, j2)인 경우도 발생할 수 있다. 이 경우를 포함하여 확률을 구해야 한다.

Input

첫 줄에 정수 NM이 공백으로 구분되어 주어진다. (1 ≤ N, M ≤ 105)

둘째 줄에 N개의 정수 A1, A2, ..., AN이 공백으로 구분되어 주어진다. (0 ≤ Ai ≤ M - 1)

셋째 줄에 정수 T가 주어진다. (1 ≤ T ≤ N)

Output

재활용해서 만든 두 수열이 같을 확률을 출력하라. 구한 확률이 기약분수로 나타냈을 때 {P} / {Q}라면 를 대신 출력하라. 여기서 Q - 1109 + 7에 대한 Q의 모듈러 역원이다.

Examples
Input
6 4
1 2 1 2 3 0
2
Output
180555557
Input
3 1
0 0 0
2
Output
1
Input
5 10
1 1 2 3 5
3
Output
140000001
Input
28 12
0 3 1 2 3 1 2 1 2 5 8 6 7 8 6 7 6 7 10 1 11 0 1 11 0 11 0 3
3
Output
724489801
Note

첫 번째 예제의 확률은 13 / 72이다.

두 번째 예제에서는 선택할 수 있는 수열이 (0, 0) 하나밖에 없으므로 두 수열이 같을 확률은 1이다.

세 번째 예제의 확률은 1 / 50으로, (i1, j1) = (i2, j2)인 경우에만 두 수열이 같다.

Условие недоступно на русском языке
J. MEX의 MEX
time limit per test
1 second
memory limit per test
1024 megabytes
input
standard input
output
standard output

mex(S)는 집합 S에 포함되지 않는 가장 작은 음이 아닌 정수이다.

문자열 X의 부분 문자열이란 길이가 0 이상인 X의 연속된 일부분을 말한다.

'M', 'E', 'X'가 순서대로 번갈아 등장하는 길이 0 이상의 문자열을 MEX 문자열 이라고 하자. 예를 들어 "", "M", "MEX", "MEXME"는 MEX 문자열이지만 "MMEX", "EXM", "EX" 등은 MEX 문자열이 아니다.

문자열로만 이루어진 집합 S의 점수를 mex(|k|: k ∈ S)이라고 하자.

MEX 문자열 M의 길이 N이 주어질 때 M의 MEX 문자열인 부분 문자열을 겹치지 않고 선택해 만들 수 있는 집합의 최대 점수를 출력하라. M 부분문자열이 겹치지 않는다는 것은 M의 모든 문자는 많아야 하나의 부분문자열에만 포함된다는 것이다.

Input

첫째 줄에 테스트케이스의 개수 T가 주어진다. (1 ≤ T ≤ 100 000)

각 테스트케이스의 첫째 줄에는 MEX 문자열 M의 길이 N이 주어진다. (1 ≤ N ≤ 1018)

Output

테스트케이스마다 집합의 점수의 최댓값을 출력한다.

Example
Input
5
1
3
4
8
324513245432
Output
2
2
3
4
805621

Условие недоступно на русском языке
K1. 부도덕한 그래프 (Easy)
time limit per test
1 second
memory limit per test
1024 megabytes
input
standard input
output
standard output

이 문제는 부도덕한 그래프 (Hard)와 NM의 제한을 제외하면 동일한 문제입니다.

그래프 세계에선 서로 말 한마디 섞어본 적 없는 두 정점이 같은 자식을 갖기도 한다.

사이클 없는 단순 방향 그래프의 서로 다른 정점 x, y, z가 다음 조건을 모두 만족하면 이를 부도덕한 관계라고 한다.

  • x에서 z로 가는 간선과 y에서 z로 가는 간선이 모두 존재한다.
  • xy를 잇는 간선이 없다.

그래프 세계에선 이런 관계가 꽤 흥미로운 구조로 취급된다.

N개의 정점과 M개의 간선으로 이루어진 사이클 없는 단순 방향 그래프가 주어진다. 부도덕한 관계의 개수를 구해 보자.

Input

첫째 줄에 정점의 수 N과 간선의 수 M이 공백으로 구분되어 주어진다. (3 ≤ N ≤ 2 000; 1 ≤ M ≤ 4 000)

둘째 줄부터 M개의 줄에 걸쳐 간선을 나타내는 두 정수 u, v가 공백으로 구분되어 주어진다. 이는 정점 u에서 정점 v로 향하는 간선을 의미한다. (1 ≤ u, v ≤ N)

주어진 그래프는 사이클 없는 단순 방향 그래프이다.

입력으로 주어지는 모든 수는 정수이다.

Output

주어진 그래프에 존재하는 부도덕한 관계의 수를 출력한다.

Example
Input
6 6
2 3
3 1
2 1
2 6
5 6
4 6
Output
3

Условие недоступно на русском языке
K2. 부도덕한 그래프 (Hard)
time limit per test
1 second
memory limit per test
1024 megabytes
input
standard input
output
standard output

이 문제는 부도덕한 그래프 (Easy)와 NM의 제한을 제외하면 동일한 문제입니다.

그래프 세계에선 서로 말 한마디 섞어본 적 없는 두 정점이 같은 자식을 갖기도 한다.

사이클 없는 단순 방향 그래프의 서로 다른 정점 x, y, z가 다음 조건을 모두 만족하면 이를 부도덕한 관계라고 한다.

  • x에서 z로 가는 간선과 y에서 z로 가는 간선이 모두 존재한다.
  • xy를 잇는 간선이 없다.

그래프 세계에선 이런 관계가 꽤 흥미로운 구조로 취급된다.

N개의 정점과 M개의 간선으로 이루어진 사이클 없는 단순 방향 그래프가 주어진다. 부도덕한 관계의 개수를 구해 보자.

Input

첫째 줄에 정점의 수 N과 간선의 수 M이 공백으로 구분되어 주어진다. (3 ≤ N ≤ 50 000; 1 ≤ M ≤ 50 000)

둘째 줄부터 M개의 줄에 걸쳐 간선을 나타내는 두 정수 u, v가 공백으로 구분되어 주어진다. 이는 정점 u에서 정점 v로 향하는 간선을 의미한다. (1 ≤ u, v ≤ N)

주어진 그래프는 사이클 없는 단순 방향 그래프이다.

입력으로 주어지는 모든 수는 정수이다.

Output

주어진 그래프에 존재하는 부도덕한 관계의 수를 출력한다.

Example
Input
6 6
2 3
3 1
2 1
2 6
5 6
4 6
Output
3