POJ2769 Reduced ID Numbers 求余应用-暴力

本文提供了一道关于寻找一组学生证号码(SIN)中能使所有号码对某整数m取余不同的最小m值的算法题解。通过遍历可能的m值,并使用数组记录余数是否出现过,最终找到符合条件的最小m。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://poj.org/problem?id=2769


题目大意:T.Chur在大学里教授不同群体的学生,每个学生都有一个独特的学生证号码SIN(0到10^6范围内的整数).T.Chur希望在每个分组内找到最小的整数m,使得该组内的所有SIN对m取余的值都不同。


分析:从0开始枚举每一个整数i作为m的值,分别判断分组内有没有两个数对m取余相同即可。可以用一个数组p标记已经出现过的余数。


实现代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define maxn 100005
int a[maxn];
bool p[maxn];
int main()
{
    int t,n,ans;
    cin>>t;
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
          scanf("%d",&a[i]);
        for(int i=1;i<maxn;i++)
        {
            memset(p,0,sizeof(p));
            bool flag=true;
            for(int j=0;j<n;j++)
              if(p[ a[j]%i ])
              {
                  flag=false;
                  break;
              }
              else p[ a[j]%i ]=1;
            if(flag)
            {
                ans=i;
                break;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值