結果
| 問題 |
No.854 公平なりんご分配
|
| コンテスト | |
| ユーザー |
LayCurse
|
| 提出日時 | 2019-07-26 22:02:15 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,574 bytes |
| コンパイル時間 | 2,104 ms |
| コンパイル使用メモリ | 195,280 KB |
| 最終ジャッジ日時 | 2025-01-07 07:56:32 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 30 WA * 62 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
void *wmem;
template<class S, class T> inline S min_L(S a,T b){
return a<=b?a:b;
}
inline void rd(int &x){
int k, m=0;
x=0;
for(;;){
k = getchar_unlocked();
if(k=='-'){
m=1;
break;
}
if('0'<=k&&k<='9'){
x=k-'0';
break;
}
}
for(;;){
k = getchar_unlocked();
if(k<'0'||k>'9'){
break;
}
x=x*10+k-'0';
}
if(m){
x=-x;
}
}
inline void wt_L(char a){
putchar_unlocked(a);
}
inline void wt_L(const char c[]){
int i=0;
for(i=0;c[i]!='\0';i++){
putchar_unlocked(c[i]);
}
}
int Prime_L(int N, int res[], void *mem=wmem){
bool *isprime;
const int r=23000;
int a, b, i, *sf, ss=1, sz=1;
isprime = (bool*)mem;
sf = (int*)(isprime + r);
N /= 2;
res[0] = 2;
b =min_L(r, N);
for(i=1;i<b;i++){
isprime[i] = 1;
}
for(i=1;i<b;i++){
if(isprime[i]){
res[sz++] = 2*i+1;
sf[ss] = 2*i*(i+1);
if(sf[ss] < N){
while(sf[ss] < r){
isprime[sf[ss]] = 0;
sf[ss] += res[ss];
}
ss++;
}
}
}
for(a=r; a<N; a+=r){
b =min_L(a + r, N);
isprime -= r;
for(i=a;i<b;i++){
isprime[i] = 1;
}
for(i=1;i<ss;i++){
while(sf[i] < b){
isprime[sf[i]] = 0;
sf[i] += res[i];
}
}
for(i=a;i<b;i++){
if(isprime[i]){
res[sz++] = 2*i+1;
}
}
}
return sz;
}
char memarr[96000000];
int N;
int A[100000];
int Q;
int P[100000];
int L[100000];
int R[100000];
int res[100000];
int ok[100001];
int dm[100001];
int fc[100001];
int ps;
int prm[1000];
int cnt[100000];
int main(){
int i, j, k;
wmem = memarr;
ps =Prime_L(2000, prm);
rd(N);
{
int Lj4PdHRW;
for(Lj4PdHRW=0;Lj4PdHRW<N;Lj4PdHRW++){
rd(A[Lj4PdHRW]);
}
}
rd(Q);
{
int KL2GvlyY;
for(KL2GvlyY=0;KL2GvlyY<Q;KL2GvlyY++){
rd(P[KL2GvlyY]);
rd(L[KL2GvlyY]);L[KL2GvlyY] += (-1);
rd(R[KL2GvlyY]);
}
}
for(i=0;i<Q;i++){
res[i] = 1;
}
for(i=0;i<N;i++){
k = A[i];
if(k==0){
ok[i+1] = 1;
continue;
}
for(j=0;j<ps;j++){
while(k%prm[j]==0){
k /= prm[j];
}
}
if(k > 1){
dm[i+1] = 1;
continue;
}
}
for(i=0;i<N;i++){
ok[i+1] += ok[i];
}
for(i=0;i<N;i++){
dm[i+1] += dm[i];
}
for(i=0;i<Q;i++){
if(ok[R[i]]-ok[L[i]]){
res[i] = 2;
continue;
}
if(dm[R[i]]-dm[L[i]]){
res[i] = 0;
continue;
}
}
for(k=0;k<ps;k++){
j = 0;
for(i=0;i<Q;i++){
if(res[i]==1){
cnt[i] = 0;
while(P[i]%prm[k]==0){
P[i] /= prm[k];
cnt[i]++;
j++;
}
}
}
if(j==0){
continue;
}
for(i=0;i<N+1;i++){
fc[i] = 0;
}
for(i=0;i<N;i++){
if(ok[i+1]-ok[i] || dm[i+1]-dm[i]){
continue;
}
while(A[i]%prm[k]==0){
A[i] /= prm[k];
fc[i+1]++;
}
}
for(i=0;i<N;i++){
fc[i+1] += fc[i];
}
for(i=0;i<Q;i++){
if(res[i]==1){
if(fc[R[i]]-fc[L[i]] < cnt[i]){
res[i] = 0;
}
}
}
}
for(i=0;i<Q;i++){
if(res[i]){
wt_L("Yes");
wt_L('\n');
}
else{
wt_L("NO");
wt_L('\n');
}
}
return 0;
}
// cLay varsion 20190721-1
// --- original code ---
// int N, A[1d5];
//
// int Q, P[1d5], L[1d5], R[1d5];
// int res[1d5];
//
// int ok[100001], dm[100001], fc[100001];
//
// int ps, prm[1000];
// int cnt[1d5];
//
// {
// int i, j, k;
//
// ps = Prime(2000, prm);
//
// rd(N,A(N),Q,(P,L--,R)(Q));
// rep(i,Q) res[i] = 1;
//
// rep(i,N){
// k = A[i];
// if(k==0){ ok[i+1] = 1; continue; }
// rep(j,ps) while(k%prm[j]==0) k /= prm[j];
// if(k > 1){ dm[i+1] = 1; continue; }
// }
//
// rep(i,N) ok[i+1] += ok[i];
// rep(i,N) dm[i+1] += dm[i];
//
// rep(i,Q){
// if(ok[R[i]]-ok[L[i]]){ res[i] = 2; continue; }
// if(dm[R[i]]-dm[L[i]]){ res[i] = 0; continue; }
// }
//
// rep(k,ps){
// j = 0;
// rep(i,Q) if(res[i]==1){
// cnt[i] = 0;
// while(P[i]%prm[k]==0) P[i] /= prm[k], cnt[i]++, j++;
// }
// if(j==0) continue;
//
// rep(i,N+1) fc[i] = 0;
// rep(i,N){
// if(ok[i+1]-ok[i] || dm[i+1]-dm[i]) continue;
// while(A[i]%prm[k]==0) A[i] /= prm[k], fc[i+1]++;
// }
// rep(i,N) fc[i+1] += fc[i];
//
// rep(i,Q) if(res[i]==1){
// if(fc[R[i]]-fc[L[i]] < cnt[i]) res[i] = 0;
// }
// }
//
// rep(i,Q) wt(if[res[i],"Yes","NO"]);
// }
LayCurse