C - Colliders (素数筛&模拟)
思路:本题关键 在于判断是否冲突,互质的一个特点:两个数的素因子没有交集。
因此我们可以用一个数组储存每个素因子的归属,并且用一个二维 v e c t o r vector vector保存每个数的素因子。
再用一个 v i s [ ] vis[] vis[]数组记录机器是否打开,就可以完成模拟了,具体看代码。
AC代码:
#include<cstdio>
#include<vector>
#include<iostream>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int vis[N],bl[N];//bl[i]表示因子i属于那个数. belong to
vector<int>v[N];///vis[i]标记是否已经打开.
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++) //对[1,n]中每个数的所有素因子放入.
if(v[i].empty())//素数则为空.
for(int j=i;j<=n;j+=i) v[j].push_back(i);//类似素数筛
cin.tie(0);
while(m--){
char c;
int id;
cin>>c>>id;
if(c=='+')
{
if(vis[id]) puts("Already on");
else {
int f=0;
for(auto i:v[id])
if(bl[i]){
f=bl[i];
break;
}
if(!f){
puts("Success");
for(auto i:v[id])
bl[i]=id;
vis[id]=1;
}
else printf("Conflict with %d\n",f);
}
}
else {
if(!vis[id]) puts("Already off");
else {
puts("Success");
for(auto i:v[id]) //还原.
bl[i]=0;
vis[id]=0;
}
}
}
return 0;
}