这是今天 CF 的 D 的一份代码。
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
bool v[1000009];
int q[1000009];
int inn;
map<pii,bool> mp;
int h[5009];
struct st{
int v,ne;
bool c;
}sd[10000009];
void add(int u,int v){
sd[++inn].v=v;
sd[inn].ne=h[u];
h[u]=inn;
sd[inn].c=0;
}
int s[10000009];
int t;
void dfs(int u){
/*if(u==1404){
cout<<t<<endl;
cout<<h[u]<<endl;//输出时输出 t,但该输出这个时 RE
}*/
for(int i=h[u]; i; i=h[u]){
h[u]=sd[i].ne;
if(!sd[i].c&&!mp[{u,sd[i].v}]&&!mp[{sd[i].v,u}]){
sd[i].c=1;
mp[{u,sd[i].v}]=1;mp[{sd[i].v,u}]=1;
dfs(sd[i].v);
}
}
s[++t]=u;
}
map<int,bool> zzz;
int ans[10000009];
int znn;
map<int,bool> zs;
void ck(int n){
zs.clear();
if(znn!=n){
cout<<"false"<<endl;
}else{
for(int i=1;i<=n;i++){if(ans[i]>300000||ans[i]<2){
cout<<"FALSE"<<endl;
return;
}
if(i<n)
if(zs[ans[i]*ans[i+1]]){
cout<<"False"<<endl;
cout<<i<<" "<<ans[i]<<" "<<ans[i+1]<<endl;
return;
}
zs[ans[i]*ans[i+1]]=1;
}
cout<<"true"<<endl;
}
}
void _main(){
znn=0;
mp.clear();
inn+=3;
while(inn--){
sd[inn]={0,0,0};
}
memset(h,0,sizeof(h));
t+=3;
while(t--){
s[t]=0;
}
t=0,inn=0;
int n,nn;
cin>>n;
if(n==3){
cout<<"2 2 3"<<endl;
return;
}
nn=n;
int m;
m=1;
for(int i=1;i<=5005;i++){
if(i&1){
if((i*i+i)/2>=n-1){
m=i;
break;
}
}else{
if(i*i/2+1>=n-1){
m=i;
break;
}
}
}
mp.clear();
for(int i=1;i<m;i++){
for(int j=i+1;j<=m;j++){
if(i!=j&&(m%2||j!=i+1||i%2==0||i==m-1)){
add(i,j);
add(j,i);
}
}
}
dfs(m);
int p;
p=0;
while(n>0){
cout<<q[s[++p]]<<" ";
ans[++znn]=q[s[p]];
n--;
if(!zzz[q[s[p]]]&&n){
cout<<q[s[p]]<<" ";
ans[++znn]=q[s[p]];
n--;
}
zzz[q[s[p]]]=1;
}
zzz.clear();
cout<<endl;
//ck(nn);
}
signed main(){
v[1]=1;
for(int i=2;i<=1000000;i++){
if(!v[i]){
q[++inn]=i;
}
for(int j=1;j<=inn&&q[j]*i<=1000000;j++){
v[q[j]*i]=1;
if(i%q[j]==0){
break;
}
}
}
int t;
cin>>t;
while(t--){
_main();
}
return 0;
}
现在有一条数据:
1 1000000
本地/莫 OJ 上测试莫名 RE,是在 dfs 过程中,某一时刻访问 h[1404] 时 RE,在此之前有访问过,详见代码注释部分。
更令人难以置信的是,CF 上该代码获得了 AC,并且将这个数据试图 hack 自己发生了 hack 失败(即程序能正确输出结果),想问一下是怎么回事。