记得判断素数:1、 n <= 1 return false;2、i = 2; i <= sqrt(n); i++;写成<=害我改半天。
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i <= sqrt(n) + 1; i++) {
if (n % i == 0) return false;
}
return true;
}
bool vis[100010];
vector<int> v;
int main() {
int m, n, a;
scanf ("%d %d", &m, &n);
while (!isPrime(m)) m++;
v.resize(m);
for (int i = 0; i < n; i++) {
if (i != 0) printf (" ");
scanf ("%d", &a);
int flag = 0;
if (vis[a % m] == false) {
vis[a % m] = true;
printf ("%d", a % m);
v[a % m] = a;
flag = 1;
}
else if (vis[a % m] == true && v[a % m] == a) {
printf ("%d", a % m);
flag = 1;
}
else {
for (int j = 1; j <= m / 2; j++) {
int q = j * j;
if (vis[(a + q) % m] == false) {
vis[(a + q) % m] = true;
printf ("%d", (a + q) % m);
v[(a + q) % m] = a;
flag = 1;
break;
}
}
}
if (flag == 0) printf ("-");
}
}