同余的应用,哈希。题意:给你G个学生的编号,编号为0~10^6的整数,请你找出最小的正整数m使得所有学生的编号对与模m不同余。
我的解题思路:从小到大枚举m然后哈希判断是否都不同余。我想到了一个小小的优化就是如果有n个学生的话,那么最小的正整数m至少是n,这个思想是基于容斥原理的。但是还是TLE了,最后看了讨论版才知道memset的优化,只memset用过的部分。优化后从TLE到200ms左右,题目的时间限制是2000ms......
我的解题代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
using namespace std;
const int N = 1000001;
int n;
int num[N];
bool vis[N];
void InitRead();
void DataProcess();
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
InitRead();
DataProcess();
}
return 0;
}
void InitRead()
{
scanf("%d", &n);
for (int i=0; i<n; ++i)
{
scanf("%d", &num[i]);
}
return;
}
void DataProcess()
{
int ans = n;
while (true)
{
bool find = true;
memset(vis, false, ans*sizeof(vis[0])); //关键优化,没有就超时,有的话就200ms左右
for (int i=0; i<n; ++i)
{
if (vis[num[i] % ans])
{
find = false;
break;
}
vis[num[i] % ans] = true;
}
if (find) break;
++ans;
}
printf("%d\n", ans);
return;
}