[入门赛 #9] 牵连的世界 (Hard Version)题解

· · 题解

原题跳转

首先我们来读读题

题目大意: 给定 3 份代码,让这些代码执行一下的错误。

注:产生运行时未定义行为仅包括数组越界。

那么,我们先来看第一题

NO.1

给出 n 个整数,求其中奇数的个数

乍一看,好像有一个 % 运算符,这时有的同学就想:这有什么用呢?那我们就来看看它的作用。

在要求中, % 一个负数会得到一个正数,可是c++非要与众不同,一个正数 mod 一个负数会得到一个负数。那么我们就可以用这个 bug 特性来解决第一题。

那么第一题的代码如下:

if(n==1){
    cout<<"1"<<endl;
    cout<<"-1"<<endl;
}

接下来,我们来看第二题

NO.2

判定 p 是否为质数 在代码中,有一个与众不同int 。这让我们解决问题轻松了许多。

因为 int 的范围是 2^{31}-1 。 所以我们只需要给出一个大于 2^{31}-1 的质数就行了。

具体代码如下:

if(n==2){
    cout<<"999999999989"<<endl;
}

然后,就是最后一题了

NO.3

给定 n 个整数,第 i 个为 a_i ,找到最大的数 p ,使其满足 a_i \ge pi 个数不小于\begin{bmatrix} \frac{n}{2} \end{bmatrix}

这时,代码里有了数组,有些同学立马想到了 RE 。但是乍一看,输入的 n 比数组范围小了不止亿点。。。

但又一看,又发现了一个 int 。这时,同学们又会想怎样爆它呢?

然后,我们发现了 L+R 是很容易爆 int 的,然后我们就只需输入两个大于 int 范围的数就行了。

具体代码如下:

if(n==3){
    cout<<"2"<<endl;
    cout<<"2000000000 2000000000"<<endl;
}

注:这是一道 Hack 题,我们做的是生成器,所以要用 cout 对程序输入要输入的数。

AC Code

#include<iostream>
using namespace std;

int main(){
    int n;
   cin>>n;
   if(n==1){
        cout<<"1"<<endl;
        cout<<"-1"<<endl;
    }
   if(n==2){
        cout<<"999999999989"<<endl;
    }
   if(n==3){
        cout<<"2"<<endl;
        cout<<"2000000000 2000000000"<<endl;
   }
    return 0;
}

本蒟蒻的第一篇题解,求管理员大大通过。。。

如果有什么不合规的地方请指出,本蒟蒻一定及时修改!