#YDRS014F. 有点 CTF

有点 CTF

题目描述

这是一道 Hack 题。在本题中,你将得到一个问题和一个解决对应问题的代码,你需要提交一份符合要求的输入数据,使得给定的代码不能给出正确的输出。

这是一个经典的高斯消元问题:

给定正整数 nnn×nn\times n 的矩阵 aa 和长度为 nn 的序列 bb。判断方程组是否有唯一解:

$$\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} $$

数据范围:1n31\le n\le 3ai,j,bi5|a_{i,j}|,|b_i|\le 5ai,j,bia_{i,j},b_i10610^{-6} 的整数倍。

输入的时候先输入正整数 nn,后 nn 行每行输入 n+1n+1 个整数 a1,a2,,an,ba'_1,a'_2,\cdots,a'_n,b',真实的 a,ba,b 由下式导出:

$$a_{i,j}=\dfrac{a'_j}{10^6}\qquad b_i=\dfrac{b'}{10^6} $$

由于 ai,j,bi5|a_{i,j}|,|b_i|\le 5,所以此处 ai,b5×106|a'_i|,|b'|\le5\times 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;
}

你需要构造一组输入数据,使得上述代码得到错误答案。

输出格式

第一行一个正整数 nn

nn 行,每行 n+1n+1 个整数。

样例 #1

样例输入 #1

3
1 2 3 4
5 6 7 8
9 10 11 12

样例输出 #1

Yes

样例解释

(样例仅供演示欲 Hack 程序运行结果,并非本题答案)