#P07752. 夏令营旗手
Description
2022年湖南省《信息与未来》小学夏令营将在衡阳市八中进行,组委会决定在衡阳市八中的学生中推选一名旗手,推选方法如下:
衡阳市八中有n名学生(1<=n<=1000)。每名学生有一个学号,学号为(1,2,3,4......n)。同时,每名同学有一张选票,可以推选一名同学为旗手。最后,得票最多者当选,若得票最多者相同票数,则学号小者当选。
例如n=8,选票为2 3 4 4 3 4 1 6,4号学生得票最多(3票)当选小旗手。
Input
n和x1两个整数,n为学生数,x1为第一个选票上的学号,之后的选票Xi(i>=2)由下面的递推关系给出:
Xi=((X(i-1)*37+33031)% n)+1
根据这个公式,就能从X1推导出X2,X3,X4.......Xn.
Output
一个整数,即选出的旗手的学号。
Samples
输入数据 1
5 2
Copy
输出数据 1
2
Copy
Limitation
1s, 1024KiB for each test case.
思路:
根据递推式Xi=((X(i-1)*37+33031)% n)+1,直接带入求值。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x1,x[1001],f[1001];
memset(x,0,sizeof(x));
memset(f,0,sizeof(f));
cin>>n>>x1;
x[1]=x1;
for(int i=2;i<=n;i++)
{
x[i]=((x[i-1]*37+33031)%n)+1;
}
for(int i=1;i<=n;i++)
{
f[x[i]]++;
}
int max=-1,ans;
for(int i=1;i<=n;i++)
{
if(f[i]>max)
{
max=f[i];
ans=i;
}
}
cout<<ans;
return 0;
}
//Xi=((X(i-1)*37+33031)% n)+1