C - Colliders (素数筛&模拟)

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;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷的Herio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值