結果

問題 No.670 log は定数
ユーザー bal4u
提出日時 2019-05-17 21:07:34
言語 C
(gcc 13.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
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 10
権限があれば一括ダウンロードができます

ソースコード

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