拖了几天才写
刚开始以为题目是余数存进来,重复的就输出 -
后来提交一个都没对。。读题发现一串我不认识的英文
二次方探测法(已收藏了大佬的文章)
更新写过还差了一个点,看了一圈应该是M<=1 的时候的特殊情况了
最开始用了素数表,后来写了个素数判断函数加上了对1的判断,通过了
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
using namespace std;
int isprime(int n){
if(n<=1) return 0;
for(int i=2; i*i<= n; i++){
if(n%i==0) return 0;
}
return 1;
}
int n,m;
int /*isprime[110000],*/ arr[11000];
int ans[110000], brr[110000];
int main(){
/*for(int i=2; i * i < 11000; i++){
for(int j=2; j * i < 11000; j++){
isprime[i*j] = 1;
}
}*/
memset(brr,-1,sizeof(brr));
scanf("%d%d",&m,&n);
for(int i=0; i<n; i++){
scanf("%d",&arr[i]);
}
while(isprime(m) == 0){
m += 1;
}
//写的有点麻烦,可以直接一个一个输入然后判断
bool key = true;
for(int i=0; i<n; i++){
int a = arr[i] % m;
if(brr[a] == -1) {
brr[a] = 0;
if(key) {
printf("%d",a);
key = false;
}
else printf(" %d",a);
}
else {
bool flag = false;
for(int j=0; j<m ; j++){
int g = (arr[i]+j*j) % m;
if(brr[g] == -1) {
brr[g] = 0;
flag = true;
if(key){
printf("%d",g);
key = false;
}
else printf(" %d",g);
break;
}
}
if(flag == false){
if(key){
printf("-");
key = false;
}
else printf(" -");
}
}
}
return 0;
}
思想斗争之后还是报了8号的甲级
虽然我现在去了顶天答70分了
试一试吧,,也做了一个月的题,,
折腾两天回学校,要开始新生活了,,