#include <stdio.h>
#define MAXR 1000
//#define MAXN 5001
#define MAXN 6
int T;
int R;
int N;
int K;
double degree[MAXN];
char direction[MAXN];
int A[MAXN * 2];
int count[MAXN];
int B[MAXN * 2];
int C[MAXN * 2];
typedef struct robot {
int x;
int y;
}Robot;
Robot rb[MAXN];
void countSort() {
int tmpLen = 2 * N;
int len = 1;
for (int i = 1; i <= N; i++) {
count[i] = 0;
}
for (int i = 1; i <= tmpLen; i++) {
count[A[i]]++;#include <stdio.h>
#define MAXR 1000
//#define MAXN 5001
#define MAXN 6
int T;
int R;
int N;
int K;
double degree[MAXN];
char direction[MAXN];
int A[MAXN * 2];
int count[MAXN];
int B[MAXN * 2];
int C[MAXN * 2];
typedef struct robot {
int x;
int y;
}Robot;
Robot rb[MAXN];
void countSort() {
int tmpLen = 2 * N;
int len = 1;
for (int i = 1; i <= N; i++) {
count[i] = 0;
}
for (int i = 1; i <= tmpLen; i++) {
count[A[i]]++;
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= count[i]; j++) {
A[len++] = i;
}
}
}
int main() {
freopen("input.txt", "r", stdin);
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++) {
scanf("%d %d %d", &R, &N, &K);
for (int i = 1; i <= N; i++) {
scanf("%d %d", &rb[i].x, &rb[i].y);
}
//degree 초기화?
int tmpY;
int tmpX;
for (int i = 1; i <= N; i++) {//각각의 로봇에 대해서..
for (int j = 1; j <= N; j++) {// 다른 로봇과의 기울기를 구해야함
tmpY = rb[i].y - rb[j].y;
tmpX = rb[i].x - rb[j].x;
if (tmpY == 0 && tmpX == 0) {//자기 자신
degree[j] = 0;
direction[j] = 9;
}
else if (tmpY == 0) {//수평 케이스
degree[j] = 0;//필요한가?
if (tmpX > 0) {
direction[j] = 5;
}
else {
direction[j] = 6;
}
}
else if (tmpX == 0) {//수직 케이스
degree[j] = 0;//필요한가?
if (tmpY > 0) {
direction[j] = 7;
}
else {
direction[j] = 8;
}
}
else {// 수평, 수직 케이스아닌경우, 둘다 0이 아닌 경우
degree[j] = (double)tmpY / tmpX;
if (tmpX > 0) {
if (tmpY > 0) {
direction[j] = 1;
}
else {
direction[j] = 2;
}
}
else {
if (tmpY > 0) {
direction[j] = 3;
}
else {
direction[j] = 4;
}
}
}
}
//i번째 로봇에 대해서 나머지 로봇의 기울기를 구함.
int cnt = 0;
int sum = 0;
for (int j = 1; j <= N; j++) {
cnt = 0;
for (int k = 1; k <= N; k++) {
if (j != k) {
if (degree[j] == degree[k] && direction[k] && direction[j] == direction[k]) {
cnt++;
direction[k] = 0;
}
}
}
sum += cnt;
}
A[i] = N - 1 - sum;
}
int sum1 = 0;
for (int i = 1; i <= N; i++) {
//printf("%d ", A[i]);
sum1 += A[i];
}
int sum2 = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
A[j] = ((A[j] * K + j) % N) + 1; // 상수 K는 입력으로 주어짐
A[N + j] = ((A[j] * j + K) % N) + 1;
}
//A[1...(2*N)]을 크기가 증가하는 순으로 정렬; // 크기가 2*N 인 배열
countSort();
B[0] = 1;
int bLen = N * 2;
for (int j = 1; j <= bLen; j++) {
B[j] = ((B[j - 1] * A[j] + j) % N) + 1;
}
C[i] = B[2 * N];
sum2 += C[i];
}
printf("#%d %d %d\n", tc, sum1, sum2);
}
return 0;
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= count[i]; j++) {
A[len++] = i;
}
}
}
int main() {
freopen("input.txt", "r", stdin);
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++) {
scanf("%d %d %d", &R, &N, &K);
for (int i = 1; i <= N; i++) {
scanf("%d %d", &rb[i].x, &rb[i].y);
}
//degree 초기화?
int tmpY;
int tmpX;
for (int i = 1; i <= N; i++) {//각각의 로봇에 대해서..
for (int j = 1; j <= N; j++) {// 다른 로봇과의 기울기를 구해야함
tmpY = rb[i].y - rb[j].y;
tmpX = rb[i].x - rb[j].x;
if (tmpY == 0 && tmpX == 0) {//자기 자신
degree[j] = 0;
direction[j] = 9;
}
else if (tmpY == 0) {//수평 케이스
degree[j] = 0;//필요한가?
if (tmpX > 0) {
direction[j] = 5;
}
else {
direction[j] = 6;
}
}
else if (tmpX == 0) {//수직 케이스
degree[j] = 0;//필요한가?
if (tmpY > 0) {
direction[j] = 7;
}
else {
direction[j] = 8;
}
}
else {// 수평, 수직 케이스아닌경우, 둘다 0이 아닌 경우
degree[j] = (double)tmpY / tmpX;
if (tmpX > 0) {
if (tmpY > 0) {
direction[j] = 1;
}
else {
direction[j] = 2;
}
}
else {
if (tmpY > 0) {
direction[j] = 3;
}
else {
direction[j] = 4;
}
}
}
}
//i번째 로봇에 대해서 나머지 로봇의 기울기를 구함.
int cnt = 0;
int sum = 0;
for (int j = 1; j <= N; j++) {
cnt = 0;
for (int k = 1; k <= N; k++) {
if (j != k) {
if (degree[j] == degree[k] && direction[k] && direction[j] == direction[k]) {
cnt++;
direction[k] = 0;
}
}
}
sum += cnt;
}
A[i] = N - 1 - sum;
}
int sum1 = 0;
for (int i = 1; i <= N; i++) {
//printf("%d ", A[i]);
sum1 += A[i];
}
int sum2 = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
A[j] = ((A[j] * K + j) % N) + 1; // 상수 K는 입력으로 주어짐
A[N + j] = ((A[j] * j + K) % N) + 1;
}
//A[1...(2*N)]을 크기가 증가하는 순으로 정렬; // 크기가 2*N 인 배열
countSort();
B[0] = 1;
int bLen = N * 2;
for (int j = 1; j <= bLen; j++) {
B[j] = ((B[j - 1] * A[j] + j) % N) + 1;
}
C[i] = B[2 * N];
sum2 += C[i];
}
printf("#%d %d %d\n", tc, sum1, sum2);
}
return 0;
}
댓글