1、题面:
https://pintia.cn/problem-sets/994805342720868352/problems/994805343236767744
2、题意:
S,n,m,给定表长,n个数插入,m个数查询
s要转为大于它的最小素数
3、正解:
模拟,需要知道概念
4、错误:
查询的时候遇到==0也要break,==0说明插入时候没有遇到过,之后的就不要查了
5、思维:
插入的时候==tsize是不用的
查询的时候不知道为什么又==tsize了
如果一定要<tsize,那ans开始置1,++放在break后面
Ans = 1;
For{
If( || ) break;
Ans++;
}
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int lis[N]={0};
int pri(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0) return 0;
}
return 1;
}
int main(){
int s,m,n,j,a;
cin>>s>>n>>m;
while(!pri(s)) s++;
for(int i=1;i<=n;i++){
scanf("%d",&a);
for(j=0;j<s;j++){// ==s等价于0,影响不大
int t = (a+j*j)%s;
if(!lis[t]){
lis[t] = a;
break;
}
}
if(j==s){
printf("%d cannot be inserted.\n",a);
}
}
int ans = 0;
for(int i=1;i<=m;i++){
scanf("%d",&a);
for(j=0;j<=s;j++){//必须要<=s //少个= 会使ans少加一次
ans++; //不知道这个坑那些人是怎么避开的
int t = (a+j*j)%s;
if(lis[t] == a || lis[t]==0) break;//必须包含lis[t]==0
}//==0说明没有这个数插入
}
printf("%.1lf\n",ans*1.0/m);
}