codeforces 155D 质数

题意:有编号1到n的n台机器,有m次操作,操作为开启或关闭机器,成功开启机器k的条件为k和所有已经开启的机器编号互质。

思路:vis[i]数组存放占领i这个位置的机器编号,因为所有开启的机器的编号互质,所以每个i至多只被1台机器占领。open数组保存机器的开启状态。

开启编号为k的机器操作:枚举k的所有因子,若vis[k的任意因子]=0,则成功开启,vis[k的任意因子]=k,open[k]=1。

关闭编号为k的机器操作:枚举k的所有因子,vis[k的任意因子]=0。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int vis[100010];
int open[100010]; //0为关闭 1为开启 
int main() {
    int n,m,x;
    char c;
    memset(vis,0,sizeof vis);
    memset(open,0,sizeof open);
    scanf("%d%d",&n,&m);
    while(m--) {
        getchar();
        scanf("%c %d",&c,&x);
        if(c=='+') {
            if(open[x]==1) puts("Already on");
            else {
                int flag=0;
                for(int i=2;i*i<=x;i++) {
                    if(x%i==0) {
                        if(vis[i]!=0) {
                            flag=vis[i];break;
                        }
                        if(vis[x/i]!=0) {
                            flag=vis[x/i];break;
                        }
                    }
                }
                if(vis[x]!=0) flag=vis[x];
                if(flag==0) {
                    puts("Success");
                    open[x]=1;
                    for(int i=2;i*i<=x;i++) {
                        if(x%i==0) vis[i]=vis[x/i]=x;        
                    }
                    vis[x]=x;
                }
                else printf("Conflict with %d
",flag);
            }
        }
        else if(c=='-') {
            if(open[x]==0) puts("Already off");
            else {
                puts("Success");
                open[x]=0;
                for(int i=2;i*i<=x;i++) {
                    if(x%i==0) vis[i]=vis[x/i]=0;
                }
                vis[x]=0; 
            }
        } 
    }
    return 0; 
} 
原文地址:https://www.cnblogs.com/LinesYao/p/5709424.html