Codeforces 154B Colliders

来源:互联网 发布:我知女人心粤语 编辑:程序博客网 时间:2024/06/05 12:45

题意:

给出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;}


0 0
原创粉丝点击