- * ì‚¬ì‹ ë�„
- A-B-C-D(-A) 와 같� 순서가 ��� 하는 것� 경우� 수 구하기
- 염주 수열� 같� 것으로 본다.
- ëª¨ë“ A와 Cì—� 대해서 한다.(n^2)
- B와 D� 후보를 찾아서 조건� 맞는지 확�한다.(A,C와 연결�어있는지) (n)
- í† íƒˆ n^3
- ì¤‘ë³µì œê±°. A-B-C-D는 숫ìž�로 주어지므로 ìš°ì„ ìˆœìœ„ë¥¼ ì •í•œë‹¤.(e.g. ìž‘ì�€ 숫ìž� ìš°ì„ )
- Aê°€ í•ìƒ� 가장 ìž‘ì�€ 숫ìž�ê°€ ë�˜ë�„ë¡� 한다. B와 Cì�˜ í�¬ê¸°ëŠ” 바뀔 수 있는ë�°, A-B-C-D와 A-C-B-D 둘 모ë‘� 다른 ì •ë‹µìœ¼ë¡œ 보기 때문ì�´ë‹¤.
//
// fourgods.cpp
// codersHigh2013
//
// Created by Jereneal Kim on 13. 8. 6..
// Copyright (c) 2013ë…„ Jereneal Kim. All rights reserved.
//
#include <iostream>
using namespace std;
int T,N,M;
int arr[501][501];
typedef struct Edge{
int u;
int v;
}Edge;
bool comp(Edge a,Edge b){
if(a.u!=b.u){
return a.u<b.u;
}else{
return a.v<b.v;
}
}
int main(int argc, const char * argv[])
{
freopen("/Users/jkim/Development/C&C++/codersHigh2013/codersHigh2013/input.txt","r",stdin);
int i,j,k,num;
scanf("%d",&T);
for(int iter=0;iter<T;iter++){
num=0;
for(i=0;i<500;i++){
for(j=0;j<500;j++){
arr[i][j] = 0;
}
}//initalize
scanf("%d %d",&N,&M);
for(i=0;i<M;i++){
int tmp1,tmp2;
scanf("%d %d",&tmp1,&tmp2);
arr[tmp2][tmp1] = 1;
arr[tmp1][tmp2] = 1;
}
// get A & C
for(i=1;i<=N;i++){
for(k=i+1;k<=N;k++){
int tmpNum=0;
for(j=i+1;j<=N;j++){
if(arr[i][j]&&arr[j][k]){
tmpNum++;
}
}
num+=tmpNum*(tmpNum-1)/2;
num%=20130728;
}
}
printf("%d\n",num);
}
return 0;
}