結果
| 問題 |
No.854 公平なりんご分配
|
| コンテスト | |
| ユーザー |
CuriousFairy315
|
| 提出日時 | 2019-02-22 22:28:06 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,651 ms / 3,153 ms |
| コード長 | 1,708 bytes |
| コンパイル時間 | 686 ms |
| コンパイル使用メモリ | 70,400 KB |
| 最終ジャッジ日時 | 2025-01-06 21:41:07 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 92 |
ソースコード
#include<iostream>
#include<bitset>
using namespace std; // 575
const int MAX = 100001;
const int MAX2 = 2001;
const int PRIME = 303; // 2000までの素数
const string ERROR = "No Judge";
int main() {
static int N, A[MAX], Q, P, L, R;
cin >> N;
if (!(1 <= N && N <= 100000)) {
cout << ERROR << endl;
return 0;
}
for (int i = 0;i < N;++ i) {
cin >> A[i];
if (!(0 <= A[i] && A[i] <= 2000)) {
cout << ERROR << endl;
return 0;
}
}
static int prime[PRIME], sum[PRIME][MAX], sumZero[MAX];
bitset<MAX2> sieve; // エラトステネスの篩
for (int i = 2, j = 0;i < MAX2;++ i) {
if (!sieve[i]) {
prime[j++] = i;
for (int k = i;k < MAX2;k += i) sieve[k] = true;
}
}
for (int i = 0;i < PRIME;++ i) sum[0][i] = 0;
sumZero[0] = 0;
for (int i = 0;i < N;++ i) { // 累積和
sumZero[i + 1] = sumZero[i];
if (A[i] == 0) ++ sumZero[i + 1]; // ゼロの区間が増える
else for (int j = 0;j < PRIME;++ j) for (sum[j][i + 1] = sum[j][i];A[i] % prime[j] == 0;++ sum[j][i + 1], A[i] /= prime[j]); // 各素因数について累積和
}
// ここまでで前準備終わり、次に各クエリの処理
cin >> Q;
if (!(1 <= Q && Q <= 100000)) {
cout << ERROR << endl;
return 0;
}
while (Q-- > 0) {
cin >> P >> L >> R;
bool isDiv = true; // 割り切れるかフラグ
for (int i = 0;i < PRIME;++ i) {
int factor = 0;
while (P % prime[i] == 0) {
P /= prime[i];
++ factor;
}
isDiv &= sum[i][R] - sum[i][L - 1] >= factor;
if (!isDiv) break;
}
if (1 <= P && P <= 1000000000 && 1 <= L && L <= R && R <= N) cout << (isDiv && P == 1 || sumZero[R] - sumZero[L - 1] > 0 ? "Yes" : "NO") << endl;
else cout << ERROR << endl;
}
return 0;
}
CuriousFairy315