C - Colliders (素數篩&模擬)
思路:本題關鍵 在於判斷是否衝突,互質的一個特點:兩個數的素因子沒有交集。
因此我們可以用一個數組儲存每個素因子的歸屬,並且用一個二維保存每個數的素因子。
再用一個數組記錄機器是否打開,就可以完成模擬了,具體看代碼。
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;
}