結果
| 問題 | No.826 連絡網 | 
| コンテスト | |
| ユーザー |  kamiyomokikanu | 
| 提出日時 | 2019-05-04 01:09:15 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 14 ms / 2,000 ms | 
| コード長 | 1,289 bytes | 
| コンパイル時間 | 624 ms | 
| コンパイル使用メモリ | 54,744 KB | 
| 実行使用メモリ | 7,424 KB | 
| 最終ジャッジ日時 | 2024-11-24 02:34:01 | 
| 合計ジャッジ時間 | 1,742 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 30 | 
ソースコード
//Y街には家1~家Nがあり、一人ずつ住んでいる。
//青木君は家Pに住む
//※互いに素---最大公約数が1
//家1~家N同士は繋がっているが、互いに素な家同士は繋がっていない。
//家の数Nと、青木君Pが与えられるので、青木君と繋がってる数を考える
//素数以外はなんやかんやつながる。素数は*2がN以内にあればつながる。で考える。
#include<iostream>
#define NMAX (1000000)
//PRIME_NUM 素数
//DEVIS_NUM not素数
#define PRIME_NUM 0
#define DEVIS_NUM 1
int main(void){
	int N,P;
	int pri[NMAX+1];
	std::cin>>N>>P;
	//WA対策。Pが1なら1を出力
	if(P==1){
		std::cout<<"1"<<std::endl;
		return 0;
	}
	//篩で素数を算出。
	for(int i=0;i<=N;i++){
		pri[i]=PRIME_NUM;
	}
	for(int i=2;i<=N;i++){
		if(pri[i]==PRIME_NUM){
			for(int j=i*2;j<=N;j+=i){
				pri[j]=DEVIS_NUM;
			}
		}
	}
	//Pが素数でP*2>Nなら、どことも繋げない。
	if(pri[P]==PRIME_NUM && P*2>N){
		std::cout<<"1"<<std::endl;
		return 0;
	}
	
	//素数に関して考慮しながら数える
	int ans=0;
	for(int i=2;i<=N;i++){
		//素数かつ、*2がN以上ならカウントしない
		if(!(pri[i]==PRIME_NUM && i*2>N)){
			ans++;
		}
	}
	std::cout<<ans<<std::endl;
	return 0;
}
            
            
            
        