結果
| 問題 |
No.371 ぼく悪いプライムじゃないよ
|
| コンテスト | |
| ユーザー |
bal4u
|
| 提出日時 | 2019-06-17 17:07:46 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 1,000 ms |
| コード長 | 1,147 bytes |
| コンパイル時間 | 424 ms |
| コンパイル使用メモリ | 32,384 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-27 19:28:39 |
| 合計ジャッジ時間 | 1,775 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 42 |
ソースコード
// yukicoder: 371 ぼく悪いプライムじゃないよ
// 2019.6.17 bal4u
#include <stdio.h>
#include <math.h>
typedef long long ll;
#define MAX 130000
#define SQRT 360
char notPrime[MAX+10] = {0,0,0,0,1}; // zero: if prime
void sieve()
{
int i, j;
for (i = 3; i <= SQRT; i += 2) {
if (!notPrime[i]) {
for (j = i * i; j <= MAX; j += i) notPrime[j] = 1;
}
}
}
ll L, H;
int check(int i) {
int j = (int)(H / i);
if (!(j & 1)) j--;
while (j > i && notPrime[j]) j -= 2;
if (j > i && (ll)i*j >= L) return j;
return 0;
}
int main()
{
int i, j, f;
ll a, ans;
scanf("%lld%lld", &L, &H);
ans = H - (H & 1);
if (H <= 8) { printf("%lld\n", ans); return 0; }
if ((a = H / 3 * 3) == L && (L & 1)) { printf("%lld\n", a); return 0; }
if (a > L && (a & 1)) ans = a;
sieve();
i = (int)sqrt((double)H);
if (!(i & 1)) i--;
j = i + 2;
f = 0;
while (i > 2) {
while (notPrime[i]) i -= 2;
if ((ll)i*i >= L) ans = (ll)i*i, f = 1;
if (!f && (a = i*(H / i)) >= L && (a & 1)) ans = a;
if (H / i > MAX) break;
if ((j = check(i)) > 0) { ans = (ll)i*j, f = 1; }
if (f) break;
i -= 2;
}
printf("%lld\n", ans);
return 0;
}
bal4u