結果

問題 No.670 log は定数
ユーザー bal4ubal4u
提出日時 2019-05-17 21:07:34
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 943 ms / 4,000 ms
コード長 1,004 bytes
コンパイル時間 220 ms
コンパイル使用メモリ 30,464 KB
実行使用メモリ 24,932 KB
最終ジャッジ日時 2024-09-17 06:01:13
合計ジャッジ時間 10,504 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 930 ms
24,784 KB
testcase_01 AC 943 ms
24,932 KB
testcase_02 AC 881 ms
24,780 KB
testcase_03 AC 831 ms
24,868 KB
testcase_04 AC 907 ms
24,812 KB
testcase_05 AC 928 ms
24,896 KB
testcase_06 AC 903 ms
24,764 KB
testcase_07 AC 855 ms
24,776 KB
testcase_08 AC 809 ms
24,788 KB
testcase_09 AC 847 ms
24,764 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// yukicoder: No.670 log は定数
// 2019.5.17 bal4u

#include <stdio.h>
#include <stdlib.h>

typedef long long ll;
typedef unsigned long long ull;

ull seed;
int xorshift() {
    seed = seed ^ (seed << 13);
    seed = seed ^ (seed >> 7);
    seed = seed ^ (seed << 17);
    return (seed >> 33);
}

#define MAX  (1<<19)   // 2^19
#define SFT  12        // 2^12
int f[MAX+3][10], s[MAX+3];
char w[MAX+3];
int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; }

int main()
{
	int i, j, a, c, k, N, Q;
	ll ans;

    scanf("%d%d%lld", &N, &Q, &seed);
	i = 10000; while (i--) xorshift();  // gomi
	i = N; while (i--) {
		a = xorshift(), k = a >> SFT;
		f[k][w[k]++] = a;
	}
	for (i = 0; i < MAX; i++) {
		s[i+1] = s[i]+w[i];
		if (w[i] > 1) qsort(f[i], w[i], sizeof(int), cmp);
	}

	ans = 0;
	for (i = 0; i < Q; i++) {
		a = xorshift(), k = a >> SFT;
		c = s[k]; for (j = 0; j < w[k]; j++) {
			if (f[k][j] >= a) break;
			c++;
		}
		ans ^= i * (ll)c;
	}
	printf("%lld\n", ans);
	return 0;
}
0