有 N 个学生,学生编号从 0 至 N - 1,第 i 个学生有 a[i] 个苹果,其中 a[i] = 1 +(i × i % M),注意: i × i 可能比较大。有 T 次操作,每次操作你可以选择一个学生,然后吃掉该学生的若干个苹果(甚至可以全部吃掉),你的目标是:T 次操作结束之后,有尽量多的学生的苹果数量相同,输出最多有多少个学生的苹果数量相同。
多组测试数据。
第一行,一个正整数 G,表示有 G 组测试数据。1 ≤ G ≤ 5。
第二行,3 个整数: N,M,T。1 ≤ N ≤ 300000,1 ≤ M ≤ 1000000000,0 ≤ T ≤ N。
共 G 行,每行一个整数。
5
10 12345678 0
10 1 0
10 12345678 3
10 10 4
100000 7 0
1
10
4
6
28572
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int G;
int mod[300010];
int n,m,t;
signed main()
{
IOS
cin>>G;
while(G--)
{
cin>>n>>m>>t;
for(int i=1;i<=n;i++)
{
mod[i]=1+((i%m)*(i%m)%m);
}
sort(mod+1,mod+n+1);
int cnt=1;
int ans=0;
for(int i=2;i<=n;i++)
{
if(mod[i]==mod[i-1])cnt++;
else
{
int big=cnt+t;
if(i+t-1>n)big=cnt+n-i+1;
ans=max(ans,big);
cnt=1;
}
}
ans=max(ans,cnt);
int zero=min(t,n);
ans=max(ans,zero);
cout<<ans<<endl;
}
}