1 条题解

  • 0

    题意分析

    1. 问题核心
      • 给定GG个互不相同的整数,寻找最小的mm,使得这些整数对mm取模的结果互不相同。
    2. 数据范围
      • G300G \leq 300SIN1061SIN \leq 10^6-1
      • 需要高效检查每个候选mm是否满足条件

    解题思路

    1. 暴力搜索
      • m=1m=1开始逐个尝试,直到找到满足条件的mm
      • 对于每个mm,检查所有SINmodmSIN \bmod m是否唯一
    2. 优化点
      • G=1G=1时直接返回11
      • 最大可能的mm不超过最大SINSIN

    实现步骤

    1. 输入处理
      • 读取所有SINSIN并存储
    2. 特殊处理
      • G=1G=1,立即输出11
    3. 枚举检查
      • m=1m=1开始递增
      • 使用哈希表检查模mm结果是否重复
    4. 输出结果
      • 找到第一个满足条件的mm立即输出

    代码实现

    #include<algorithm>
    #include<iostream>
    #include<iomanip>
    #include<cstring>
    #include<cstdlib>
    #include<vector>
    #include<cstdio>
    #include<cmath>
    #include<queue>
    using namespace std;
    inline const int Get_Int() {
        int num=0,bj=1;
        char x=getchar();
        while(x<'0'||x>'9') {
            if(x=='-')bj=-1;
            x=getchar();
        }
        while(x>='0'&&x<='9') {
            num=num*10+x-'0';
            x=getchar();
        }
        return num*bj;
    }
    int n,m,a[100005],Hash[100005],vst[1000005];
    bool Check(int x) {
        memset(Hash,0,sizeof(Hash));
        for(int i=1; i<=m; i++)
            if(Hash[a[i]%x])return false;
            else Hash[a[i]%x]=1;
        return true;
    }
    int main() {
        n=Get_Int();
        while(n--) {
            memset(vst,0,sizeof(vst));
            m=Get_Int();
            for(int i=1; i<=m; i++)a[i]=Get_Int();
            for(int i=1; i<=m; i++)
                for(int j=1; j<=m; j++)
                    vst[abs(a[i]-a[j])]=1;
            int i=m-1;
            while(++i) {
                if(vst[i])continue;
                if(Check(i)) {
                    printf("%d\n",i);
                    break;
                }
            }
        }
        return 0;
    }
    • 1

    信息

    ID
    1769
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者