给定长为 n 的随机序列 a,下标从 0 开始。给定随机数种子 seed,则 a 由如下随机算法 C++ 代码生成:(如果你是其他语言选手,请自行实现如下随机算法)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
long long seed, n, a[maxn];
long long nextRand()
{
static long long x = seed;
x ^= x << 11;
x ^= x >> 45;
x ^= x << 14;
return (x % n + n) % n;
}
signed main()
{
cin.tie(0)->ios::sync_with_stdio(false);
cin >> n >> seed;
for (int i = 0; i < n; ++i)
{
a[i] = nextRand();
}
return 0;
}
记 f(x)=\sum_{i=0}^{n-1}a_i\oplus (x\times i)\pmod n。其中 \oplus 是异或运算。请从 [0,n) 里选择两个不同的数 u,v,使得 f(u)=f(v)。
输入
输入一行两个整数 n,seed(3\le n\le10^5,1\le seed\le10^9)。保证至少有一个解。
输出
输出一行两个整数 u,v(0\le u,v < n,u\neq v)。
如果有多个解,输出任意一个即可。
样例
标准输入 复制文本 |
5 1919810 |
标准输出 复制文本 |
0 2 |
提示
对样例,a=(4,1,2,0,0)。计算得:f(0)=2,f(1)=1,f(2)=2,f(3)=1,f(4)=2,选择方案有 (0,2),(0,4),(2,4),(1,3) 四种。
题目不保证 f(x) 一定能以低于 O(n) 的复杂度计算,请不要尝试化简或加速 f(x) 的运算。
来源
2022CS杯预选赛