結果
問題 | No.854 公平なりんご分配 |
ユーザー | CuriousFairy315 |
提出日時 | 2019-02-22 06:28:57 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,563 bytes |
コンパイル時間 | 601 ms |
コンパイル使用メモリ | 70,696 KB |
最終ジャッジ日時 | 2025-01-06 21:20:12 |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 43 WA * 49 |
ソースコード
#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] + (A[i] == 0 ? 1 : 0); for (int j = 0;j < PRIME;++ j) sum[j][i + 1] = sum[j][i] + (A[i] % prime[j] == 0 ? 1 : 0); } // ここまでで前準備終わり、次に各クエリの処理 cin >> Q; if (!(1 <= Q && Q <= 100000)) { cout << ERROR << endl; return 0; } while (Q-- > 0) { cin >> P >> L >> R; bool isDiv = sumZero[R] - sumZero[L - 1] == 0; // 割り切れるかフラグ 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 (1 <= P && P <= 1000000000 && 1 <= L && L <= R && R <= N) cout << (isDiv && P == 1 ? "Yes" : "NO") << endl; else cout << ERROR << endl; } return 0; }