C - Colliders (素數篩&模擬)

C - Colliders (素數篩&模擬)

思路:本題關鍵 在於判斷是否衝突,互質的一個特點:兩個數的素因子沒有交集。

因此我們可以用一個數組儲存每個素因子的歸屬,並且用一個二維vectorvector保存每個數的素因子。

再用一個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;
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章