질문의 의미가 지금 N 크기 (1)의 각 세트를 설정하는 것은 지금 당신은 당신이 출력의 집합을 병합 할 수 있습니다 각 당신에게 말할 것이다 m 시간의 집합을 병합 할 수 있습니다에 네 개의 다른 그룹에서 네 개의 각 프로그램에서 선택한 각 조합
아이디어는 : 우리는 합병 세트와 우리가 실제로 그 합병 전에 대답을 할 수 있습니다 숫자에 대한 시뮬레이션 프로그램의 집합으로 확인 생각할 수있는 결합 수 - 두 개의 컬렉션을 프로그램의 수 (자세한 내용은 코드를 이해하기 위해)
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; CONST 이중 PI ACOS = (- 1.0 ); CONST의 INT N = 1E6 + 7 ; CONST INT INF = 0x3f3f3f3f ; CONST 두 EPS 1e- = 6 ; 타입 정의 부호없는 긴 긴 LL; CONST LL 모드 1E7 + = 9 ; LL의 F [N], 크기 [N]; LL (LL의 X) {찾을 경우 의 (X! = F [X]) [X] f를 = 찾기 (F [X]); 반환 [X] F] } INT주 () { IOS (:: sync_with_stdio 거짓으로 ) cin.tie ( 0 ) cout.tie ( 0 ) N- LL, m, CIN >> N- m, LL ANS = (__ int128) (N- . 1 ) N- * / 2 * (N- 2 ) * (N-는 3. ) / 12이고 ; // 조합 수 에 대한 (LL I = 0 ; I는 N을 <; I ++ ) { F [I] = I, 크기 [I] = . 1 ; } LL의 SUM = N-; // 기록 프로그램의 여러 개의 조합이 얼마나 (여기서는 반복) COUT << << ANS "\ n ' ; 대 (LL I = 1 ; I <= m; 내가 ++ ) { LL의 X, Y, CIN >> X >> Y; LL XX = 발견 (X) LL 증가한 = (y)를 찾아, 경우 ( ! XX = YY) { 합 - = (크기 [XX] * 크기 [XX]); 합 - = (크기 [YY * 크기 [YY]); LL TMP = 크기 [XX] * 사이즈 [YY] * ( (N 크기 [XX] - 크기 [YY]) * (N-크기 [XX] - 크기 [YY]) - 합) / 2 ] [XX] f를 = YY, 크기 [YY] + = 크기 [XX] ; 합계 + = (크기 [YY * 크기 [YY]); ANS - = TMP; } COUT << ANS << " \ 않음을 " ; } 반환 0 ; }