結果

問題 No.3246 80% Accuracy Calculator
ユーザー 👑 ygussany
提出日時 2025-08-18 09:54:35
言語 C
(gcc 13.3.0)
結果
AC  
実行時間 55 ms / 2,000 ms
コード長 1,665 bytes
コンパイル時間 314 ms
コンパイル使用メモリ 27,724 KB
実行使用メモリ 53,428 KB
平均クエリ数 382.86
最終ジャッジ日時 2025-08-18 09:55:14
合計ジャッジ時間 4,266 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 43
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.c: In function ‘add’:
main.c:32:42: warning: ‘return’ with a value, in function returning void
   32 |         if (scanf("%d", &z) != 1) return -1;
      |                                          ^
main.c:27:6: note: declared here
   27 | void add(int i, int j, int k, int x, int y)
      |      ^~~
main.c:33:28: warning: ‘return’ with a value, in function returning void
   33 |         if (z != 0) return -1;
      |                            ^
main.c:27:6: note: declared here
   27 | void add(int i, int j, int k, int x, int y)
      |      ^~~

ソースコード

diff #

#include <stdio.h>

const int thr = 20;
const int bit[25] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216};

int check(int i)
{
	int head, tail, x;
	static int num[10000000] = {}, q[100];
	for (tail = 0; tail < thr; tail++) {
		printf("? %c\n", 'A' + i);
		fflush(stdout);
		if (scanf("%d", &x) != 1) return -1;
		if (x < 1 || x > 8888888) return -1;
		q[tail] = x;
		num[x]++;
	}
	
	for (head = 0, x = -1; head < tail; head++) {
		if (num[q[head]] * 2 > thr) x = q[head];
		num[q[head]] = 0;
	}
	if (x >= 0) return x;
	else return check(i);
}

void add(int i, int j, int k, int x, int y)
{
	int z;
	printf("+ %c %c %c\n", 'A' + i, 'A' + j, 'A' + k);
	fflush(stdout);
	if (scanf("%d", &z) != 1) return -1;
	if (z != 0) return -1;
	z = check(k);
	if (z != x + y) add(i, j, k, x, y);
}

int main()
{
	int x, y, xy, A[3];
	x = check(0);
	y = check(1);
	if (x < 1 || x > 888 || y < 1 || y > 888) return -1;
	xy = x * y;
	A[0] = x;
	A[1] = y;
	A[2] = 0;
	
	int i, j, add_id, tmp_id, ans_id = 2;
	for (i = 0, add_id = 0; A[ans_id] != xy; i++) {
		for (j = 0; (((xy - A[ans_id]) / x) & bit[j]) == 0; j++);
		if (j == i) {
			tmp_id = 3 - ans_id - add_id;
			add(ans_id, add_id, tmp_id, A[ans_id], A[add_id]);
			A[tmp_id] = A[ans_id] + A[add_id];
			ans_id ^= tmp_id;
			tmp_id ^= ans_id;
			ans_id ^= tmp_id;
		}
		
		tmp_id = 3 - ans_id - add_id;
		add(add_id, add_id, tmp_id, A[add_id], A[add_id]);
		A[tmp_id] = A[add_id] + A[add_id];
		add_id ^= tmp_id;
		tmp_id ^= add_id;
		add_id ^= tmp_id;
	}
	printf("! %c\n", 'A' + ans_id);
	fflush(stdout);
	return 0;
}
0