QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#859826 | #6728. To the Park | 2018ljw# | AC ✓ | 34ms | 2304kb | C++14 | 990b | 2025-01-18 01:20:08 | 2025-01-18 01:20:10 |
Judging History
answer
#include<cstdio>
#include<cstring>
#include<algorithm>
const int m=1e5;
bool isp[m+5];
int p[m],tot;
void s(){
int i,j;
for(i=2;i<=m;i++){
if(!isp[i])p[++tot]=i;
for(j=1;j<=tot&&i*p[j]<=m;j++){
isp[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
}
int pl[100001],pr[100001];
bool vis[100001];
void solve(){
int n,i,j;
tot=0;
scanf("%d",&n);
for(i=2;i<=n;i++)vis[i]=0;
for(i=n/2;i>1;i--){
if(isp[i])continue;
if(i*2>n)continue;
int tp=n/i*i,cnt=0;
for(j=i;j<=n;j+=i)if(!vis[j])cnt++;
for(j=i;j<=n;j+=i){
if(vis[j]||(j==i*2&&cnt%2==1))continue;
while(tp>j&&vis[tp])tp-=i;
if(tp<=j)break;
tot++;
pl[tot]=j;pr[tot]=tp;
vis[j]=vis[tp]=1;
}
}
int lst=0;
for(i=2;i<=n;i+=2){
if(vis[i])continue;
if(!lst)lst=i;
else pl[++tot]=lst,pr[tot]=i,lst=0;
}
printf("%d",tot);
for(i=1;i<=tot;i++)printf(" %d %d",pl[i],pr[i]);
printf("\n");
}
int main(){
s();
int t;
scanf("%d",&t);
while(t--)solve();
}
这程序好像有点Bug,我给组数据试试?
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 1920kb
input:
3 1 4 6
output:
0 1 2 4 2 3 6 2 4
result:
ok 4 cases
Test #2:
score: 0
Accepted
time: 34ms
memory: 2304kb
input:
1007 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101...
output:
0 0 0 1 2 4 1 2 4 2 3 6 2 4 2 3 6 2 4 2 3 6 2 8 3 3 9 2 8 4 6 4 5 10 3 9 2 8 4 6 4 5 10 3 9 2 8 4 6 4 5 10 3 12 6 9 2 8 4 5 10 3 12 6 9 2 8 5 7 14 5 10 3 12 6 9 2 8 6 7 14 5 15 3 12 6 9 2 10 4 8 6 7 14 5 15 3 12 6 9 2 16 8 10 6 7 14 5 15 3 12 6 9 2 16 8 10 7 7 14 5 15 3 18 9 12 2 16 4 10 6 8 7 7 14 ...
result:
ok 1008 cases