luoguP1871衝突[ゲームの最初の質問の後

フェイス質問

説明表題
2312には、これらの衝突は、それぞれ1-nは自然数の識別、宇宙N巨大衝突で発見されました。科学者たちは、衝突事故の危険オフこれらの開始の状況を知らないこれらのマシンがちょうど出始めているので、チャンスが発生しました。

科学者は他のコライダーに沿ってステーションの数を特定するために発足された場合には、i番目の衝突が安全になり始めることを発見したよう互いに素コライダーの識別番号です。(iは、I、Jの互いに素を開始することができる場合、例えば、想定開始jの前に、すなわちI、J 1は、最大公約数です)。2コライダーが起動する互いに素でない場合、爆発が発生します。

前回の調査に基づき、科学者たちは、スタートアップのさまざまな操作を行うと、コライダー実験をシャットダウンする準備しました。科学者の安全を確保するためには、リモートコントロールソフトウェアを設計する必要があります。

まず、金額衝突型加速器のすべてがオフになっています。あなたのプログラムは、「起動i番目のコライダーをシャットダウンしてください。」お問い合わせの多くのフォーマットを受信します このプログラムは、(受信した問い合わせを処理するために応じて)、これらの問い合わせを処理することができなければなりません。プログラムは次の形式で処理結果を出力します。

「+ I」(i番目のスタート衝突を表して)かどうかを尋ねられたとき、このプログラムの3例は、次の出力の1に従うべきです。

(1)「成功」は、I-ステーションの開始が安全で表します。

問い合わせが開始されていた前に、(2)は、「すでにオン」、I-台湾を表します。

(3)「Jとの競合」年以下のi番目の面が最初のステージjの競合を起動した場合、あなたは私を開始することはできません。私の競合を持つ複数のフロント、いずれかとすることができるの出力のみ場合。

「-i」(オフは、i番目の衝突を示す)反芻場合、それによれば、プログラムは以下の2つのケースのいずれかの出力であるべきです。

(1)「成功」、コライダーオフi番目を表し、

問い合わせは閉鎖されていた前に、(2)は、「既にオフ」、i番目のコライダーを表します。

入力フォーマット
入力の最初の2行目の整数nおよびmは、空間によって分離されている(1 <= N、M < = 10 ^ 5)、 それぞれ、及び問い合わせ番号衝突の数。

" - I"、又は問い合わせ、または "+ I" の各行を示す次のm行(引用符なし)(1 <= I <= N)。

出力形式の
タイトル上に与えられた出力の出力形式に応じて、出力m行、。

サンプル入力出力
入力#1
10 10

  • 6
  • 10
  • 5
  • 10
  • 5
  • 6
  • 10
  • 3
  • 6
  • 3
    输出#1
    成功
    6との競合
    の成功
    はすでにオフ
    の成功
    成功
    成功
    成功
    3と競合
    すでに上

分析

これは私がそのボーエンは後に決めたあなたの過去の弱点を認識しcsp2019テスト、ヒットした後、最初の質問ではありません書かれた質問の顔を、もはや問題の意味を書きます

我々は、すべての思考の良好なプロセスを必要とします!
話題に:

これは良いですの品質係数の分解の理解件名、実際には、ノートにいくつかの詳細ということです良いアイデアを考える
第四「X注目の愚かな過ち」ホームカルーセルに含ま内容、エラーが発生しやすいポイントは、まずここに掲載しますコードは(醜い、スプレーしません

#include<cstdio>
#include<iostream>
using namespace std;
const int N = 100000+99;
inline int read() {
    char ch = getchar(); int x = 0;
    while(ch<'0' || ch>'9') {ch = getchar();}
    while(ch>='0' && ch<='9') {x = (x<<1)+(x<<3)+(ch^48); ch = getchar();}
    return x;
}

int n, m;
int not_prime[N];
int prime[N], tot, mn_prime[N];
void L_S() {
    mn_prime[1] = 1;
    for(int i = 2; i <= n; i++) {
        if(not_prime[i] == 0) {
            mn_prime[i] = i;
            prime[++tot] = i;
        }
        for(int j = 1; j <= tot && i*prime[j] <= n; j++) {
            not_prime[i*prime[j]] = 1;
            mn_prime[i*prime[j]] = prime[j];
            if(i%prime[j] == 0) break;
        }
    }
}

char cmd;
int id, tmp, is, mnprime;
int a[N];//记录每个数是隶属于哪个数(为0表示没有选 
int main() {
    n = read(), m = read();
    L_S();
//  for(int i = 1; i <= n; i++) printf("%d ", mn_prime[i]);
    for(int i = 1; i <= m; i++) {
        cin>>cmd; id = read();
        if(id == 1) {
            if(cmd == '+') {
                if(a[1] == 1) printf("Already on\n");
                else printf("Success\n");
                a[1] = 1;
            }else {
                if(a[1] == 0) printf("Already off\n");
                else printf("Success\n");
                a[1] = 0;
            }
            continue;
        }
        if(cmd == '+') {
            if(a[id] != id) {
                tmp = id;
                is = 1;
                while(tmp > 1) {//判断它的质因数是否已经被选
                    if(a[mn_prime[tmp]]) {
                        is = 0;
                        printf("Conflict with %d\n", a[mn_prime[tmp]]);
                        break;
                    }
                    mnprime = mn_prime[tmp];
                    while(tmp && tmp%mnprime == 0) tmp /= mnprime;//.........
                }
                if(is) {
                    tmp = id;
                    while(tmp > 1) {//用相同的方法把质因数都打上标记 
                        a[tmp] = id;
//                      printf("a[%d] = %d\n", tmp, id);
                        mnprime = mn_prime[tmp];
                        while(tmp && tmp%mnprime == 0) tmp /= mnprime;
                        a[mnprime] = id;//别忘了去掉的质数要在这里处理,下面也是 
                    }
                    printf("Success\n");
                }
            }else printf("Already on\n");
        }else {
            if(a[id] != id) printf("Already off\n");
            else {
                while(id > 1) {
                    a[id] = 0;
                    mnprime = mn_prime[id];
                    while(id && id%mnprime == 0) id /= mnprime;
                    a[mnprime] = 0;
                }
                printf("Success\n");
            }
        }
    }
}

おすすめ

転載: www.cnblogs.com/tyner/p/12024061.html