結果
| 問題 |
No.371 ぼく悪いプライムじゃないよ
|
| コンテスト | |
| ユーザー |
bal4u
|
| 提出日時 | 2019-06-17 14:25:29 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 1 ms / 1,000 ms |
| コード長 | 1,069 bytes |
| コンパイル時間 | 326 ms |
| コンパイル使用メモリ | 31,616 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-27 11:40:13 |
| 合計ジャッジ時間 | 1,687 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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), f = 0;
if (H <= 8) { printf("%lld\n", ans); return 0; }
if ((a = H/3*3) == L) { 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 (!f && (ll)i*i >= L) ans = (ll)i*i, f = 1;
if ((j = check(i)) > 0) { ans = (ll)i*j; break; }
if (f) break;
i -= 2;
}
printf("%lld\n", ans);
return 0;
}
bal4u