HDU 5565 Clarke and baton
原创
©著作权归作者所有:来自51CTO博客作者qq636b7aec0b3f1的原创作品,请联系作者获取转载授权,否则将追究法律责任
Problem Description
Clarke is a patient with multiple personality disorder. One day, Clarke split into guys, named to .
They will play a game called Lose Weight. Each of Clarkes has a weight . They have a baton which is always in the hand of who has the largest weight(if there are more than 2 guys have the same weight, choose the one who has the smaller order). The one who holds the baton needs to lose weight. i.e. decreased by 1, where is the guy who holds the baton.
Now, Clarkes know the baton will be passed
Input
The first line contains an integer , the number of the test cases.
Each test case contains three integers , denotes the random seed.
long long seed;
int rand(int l, int r) {
static long long mo=1e9+7, g=78125;
return l+((seed*=g)%=mo)%(r-l+1);
}
int sum=rand(q, 10000000);
for(int i=1; i<=n; i++) {
a[i]=rand(0, sum/(n-i+1));
sum-=a[i];
}
a[rand(1, n)]+=sum;
Output
Each test case print a line with a number which is , where is the
Sample Input
1
3 2 1
Sample Output
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 10000005;
const int base = 1e9 + 7;
int T, limit;
int n, q, a[maxn], ft[maxn], nt[maxn];
LL seed;
int rand(int l, int r) {
static long long mo = 1e9 + 7, g = 78125;
return l + ((seed *= g) %= mo) % (r - l + 1);
}
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d%I64d", &n, &q, &seed);
int sum = rand(q, 10000000);
limit = 0;
for (int i = 1; i <= n; i++)
{
a[i] = rand(0, sum / (n - i + 1));
sum -= a[i];
limit = max(a[i], limit);
}
limit = max(limit, a[rand(1, n)] += sum);
for (int i = 1; i <= max(limit, n); i++) ft[i] = nt[i] = 0;
for (int i = 1; i <= n; i++)
{
if (ft[a[i]])
{
nt[i] = ft[a[i]];
ft[a[i]] = i;
}
else ft[a[i]] = i;
}
int tot = 0;
for (int i = limit, j; i; i--)
{
if (q >= tot) { q = q - tot; limit = i; }
else break;
for (j = ft[i]; j; j = nt[j]) tot++;
}
int ans = 0;
for (int i = 1; i <= n; i++)
if (a[i] >= limit) if (q) { ans ^= (limit + i - 1); q--; }
else ans ^= (limit + i);
else ans ^= a[i] + i;
printf("%d\n", ans);
}
return 0;
}