题意:
给出m个操作,+表示向机器里面加一个数,-表示从机器里面删除一个数,加数时如果里面已经含有和这个数不互质的数,那么这个数加不进去。现在判断每次操作是否成功或者失败。
思路:
因为这里的数在1~n范围内,所以可以先预处理出这些数的质因数,然后加入的时候判断是否已经存在了相同的质因数,若存在着不能加入。其他的操作用hash的方法判断下就可以了。
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int MAX=1e5+5;
bool vis[MAX],zi[MAX],prime[MAX];
int n,m,hash[MAX];
vector<int> zz[MAX];
void init(){
memset(prime,true,sizeof(prime));
for(int i=2;i<=n;i++){
if(prime==false) continue;
for(int j=1;j*i<=n;j++){
zz[j*i].push_back(i);
if(j!=1) prime[j*i]=false;
}
}
}
int add(int x){
int flag=-1;
for(int i=0;i<zz[x].size();i++){
int g=zz[x][i];
if(zi[g]){
flag=g;
break;
}
}
if(flag==-1){
for(int i=0;i<zz[x].size();i++){
int g=zz[x][i];
zi[g]=true;
hash[g]=x;
}
}
return flag;
}
void del(int x){
for(int i=0;i<zz[x].size();i++){
int g=zz[x][i];
zi[g]=false;
}
}
int main(){
scanf("%d%d",&n,&m);
char op[5];
int x;
init();
memset(vis,false,sizeof(vis));
while(m--){
scanf("%s%d",op,&x);
if(op[0]=='+'){
if(vis[x]) printf("Already on\n");
else{
int t=add(x);
if(t==-1) vis[x]=true,printf("Success\n");
else printf("Conflict with %d\n",hash[t]);
}
}
else{
if(vis[x]==false) printf("Already off\n");
else{
del(x);
vis[x]=false;
printf("Success\n");
}
}
}
return 0;
}