#YDRS014F. 有点 CTF
有点 CTF
题目描述
这是一道 Hack 题。在本题中,你将得到一个问题和一个解决对应问题的代码,你需要提交一份符合要求的输入数据,使得给定的代码不能给出正确的输出。
这是一个经典的高斯消元问题:
给定正整数 、 的矩阵 和长度为 的序列 。判断方程组是否有唯一解:
$$\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1\\a_{2,1}x_1+a_{2,2}x_2+\cdots+a_{2,n}x_n=b_2\\\cdots\\a_{n,1}x_1+a_{n,2}x_2+\cdots+a_{n,n}x_n=b_n\end{cases} $$数据范围:,, 是 的整数倍。
输入的时候先输入正整数 ,后 行每行输入 个整数 ,真实的 由下式导出:
$$a_{i,j}=\dfrac{a'_j}{10^6}\qquad b_i=\dfrac{b'}{10^6} $$由于 ,所以此处 。
下面是一份尝试解决上题的代码:
#include <bits/stdc++.h>
using namespace std;
int n;
double a[150][150];
int main()
{
scanf("%d", &n);
for (int i=1; i<=n; i++)
for (int j=1, x; j<=n+1; j++) scanf("%d", &x), a[i][j] = x / 1e6;
for (int i=1; i<=n; i++)
{
int pivot = i;
for (int j=i; j<=n; j++)
if (abs(a[j][i]) > abs(a[pivot][i])) pivot = j;
swap(a[pivot], a[i]);
if (abs(a[i][i]) < 1e-13) return puts("No"), 0;
for (int j=1; j<=n; j++)
{
if (i == j) continue;
double val = a[j][i] / a[i][i];
for (int k=1; k<=n+1; k++) a[j][k] -= a[i][k] * val;
}
}
puts("Yes");
return 0;
}
你需要构造一组输入数据,使得上述代码得到错误答案。
输出格式
第一行一个正整数 。
后 行,每行 个整数。
样例 #1
样例输入 #1
3
1 2 3 4
5 6 7 8
9 10 11 12
样例输出 #1
Yes
样例解释
(样例仅供演示欲 Hack 程序运行结果,并非本题答案)