結果

問題 No.308 素数は通れません
ユーザー zerokugi
提出日時 2015-12-01 08:19:12
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
WA  
実行時間 -
コード長 1,924 bytes
コンパイル時間 889 ms
コンパイル使用メモリ 77,264 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-09-14 06:38:49
合計ジャッジ時間 3,618 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 80 WA * 27
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <set>
#include <vector>
using namespace std;

typedef __int128 Int;

Int mulMod(Int x, Int k, Int m) {
  if (k == 0)     return 0;
  if (k % 2 == 0) return mulMod((x+x) % m, k/2, m);
  else            return (x+mulMod(x, k-1, m)) % m;
}
Int powMod(Int x, Int k, Int m) {
  if (k == 0)     return 1;
  if (k % 2 == 0) return powMod(mulMod(x, x, m) % m, k/2, m);
  else            return mulMod(x, powMod(x, k-1, m), m);
}
bool suspect(Int a, int s, Int d, Int n) {
  Int x = powMod(a, d, n);
  if (x == 1) return true;
  for (int r = 0; r < s; ++r) {
    if (x == n - 1) return true;
    x = mulMod(x, x, n);
  }
  return false;
}
bool isPrime(Int n) {
  if (n <= 1 || (n > 2 && n % 2 == 0)) return false;
  int test[] = {2,3,5,7,11,13,17,19,23,27,29,31,-1};
  Int d = n - 1, s = 0;
  while (d % 2 == 0) ++s, d /= 2;
  for (int i = 0; test[i] < n && test[i] != -1; ++i)
    if (!suspect(test[i], s, d, n)) return false;
  return true;
}

vector<int> eratosthenes_sieve(int n){
	vector<int> res(n+1);
	if(n<2) return res;
	res[2]=1;
	for(int i=3;i<=n;i+=2){
		if(i*i<=n && !res[i]) for(int j=i+i+i;j<=n;j+=i+i) res[j]=1;
		res[i]=!res[i];
	}
	return res;
}
string s;
Int n;

int main(int argc, char *argv[]){
	vector<int> p = eratosthenes_sieve(100000);
	cin >> s;
	for(char c : s) n = n*10 + c - '0';
	for(int i=3;;i++){
		set<int> visited({1}), col({1}), q({1});
		int f = 0;
		while(!q.empty() && col.size() < i){
			int j = *q.begin(); q.erase(q.begin());
			if(j == n){
				f = 1;
				break;
			}
			vector<int> d;
			if(j%i != 0) d.push_back(j+1);
			if(i < j) d.push_back(j-i);
			if(j%i != 1) d.push_back(j-1);
			d.push_back(j+i);
			for(int v : d) if(v <= n && !visited.count(v) && !p[v]){
				visited.insert(v);
				col.insert(v%i);
				q.insert(v);
			}
		}
		
		if(!f && n % i != 1 && col.size() == i && !isPrime(n - i)) f = 1;
		
		if(f){
			cout << i << endl;
			return 0;
		}
	}
}
0