题意:有编号1到n的n台机器,有m次操作,操作为开启或关闭机器,成功开启机器k的条件为k和所有已经开启的机器编号互质。
思路:vis[i]数组存放占领i这个位置的机器编号,因为所有开启的机器的编号互质,所以每个i至多只被1台机器占领。open数组保存机器的开启状态。
开启编号为k的机器操作:枚举k的所有因子,若vis[k的任意因子]=0,则成功开启,vis[k的任意因子]=k,open[k]=1。
关闭编号为k的机器操作:枚举k的所有因子,vis[k的任意因子]=0。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int vis[100010]; int open[100010]; //0为关闭 1为开启 int main() { int n,m,x; char c; memset(vis,0,sizeof vis); memset(open,0,sizeof open); scanf("%d%d",&n,&m); while(m--) { getchar(); scanf("%c %d",&c,&x); if(c=='+') { if(open[x]==1) puts("Already on"); else { int flag=0; for(int i=2;i*i<=x;i++) { if(x%i==0) { if(vis[i]!=0) { flag=vis[i];break; } if(vis[x/i]!=0) { flag=vis[x/i];break; } } } if(vis[x]!=0) flag=vis[x]; if(flag==0) { puts("Success"); open[x]=1; for(int i=2;i*i<=x;i++) { if(x%i==0) vis[i]=vis[x/i]=x; } vis[x]=x; } else printf("Conflict with %d ",flag); } } else if(c=='-') { if(open[x]==0) puts("Already off"); else { puts("Success"); open[x]=0; for(int i=2;i*i<=x;i++) { if(x%i==0) vis[i]=vis[x/i]=0; } vis[x]=0; } } } return 0; }