站外题目求调
  • 板块题目总版
  • 楼主CASCwty
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/26 08:30
  • 上次更新2024/7/26 09:57:37
查看原帖
站外题目求调
761444
CASCwty楼主2024/7/26 08:30

苹果

Description

有 N 个学生,学生编号从 0 至 N - 1,第 i 个学生有 a[i] 个苹果,其中 a[i] = 1 +(i × i % M),注意: i × i 可能比较大。有 T 次操作,每次操作你可以选择一个学生,然后吃掉该学生的若干个苹果(甚至可以全部吃掉),你的目标是:T 次操作结束之后,有尽量多的学生的苹果数量相同,输出最多有多少个学生的苹果数量相同。

Format

Input

多组测试数据。

第一行,一个正整数 G,表示有 G 组测试数据。1 ≤ G ≤ 5。

第二行,3 个整数: N,M,T。1 ≤ N ≤ 300000,1 ≤ M ≤ 1000000000,0 ≤ T ≤ N。

Output

共 G 行,每行一个整数。

样例1输入

5
10 12345678 0
10 1 0
10 12345678 3
10 10 4
100000 7 0

样例1输出

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;
    }
}
2024/7/26 08:30
加载中...