【勾股定理】codeforces 2031 C. Penchick and BBQ Buns
前言
完全平方数指的是一个整数可以由另一个整数的平方得到,通俗地,若整数 \(n,m\)满足:$$n=m^2,$$称 \(n\) 为一个完全平方数(通常只讨论非负数范围)。
题目
https://codeforces.com/contest/2031/problem/C
题解
常见的完全平方数有\(0,1,4,9,16...\)。因此对于该题,我们可以对 \(n\) 的奇偶性进行分类讨论:
- \(n\) 为偶数:
已知 \(0\) 是完全平方数,因此每两个相邻位置可以放置相同的一个整数,整数可以从 \(1\) 开始放置,在下一对相邻位置,只需要放置比前一对相邻位置大 \(1\) 的数即可。
例如,\(n=6\) 的数组可以构造为 \(1,1,2,2,3,3\); - \(n\) 为奇数:
此时因为 \(n\) 为奇数,不能简单如 \(n\) 为偶数时的情形进行数组的构造。那么至少需要找到三个下标位置可以放置相同的整数,并且这三个位置两两之间的差值的绝对值是一个完全平方数。
设存在下标位置 \(i,j,k\) 满足以下关系式:- \(i \leq j \leq k\) ——式①
- \(j-i=x^2\) ——式②
- \(k-j=y^2\) ——式③
- \(k-i=z^2\) ——式④
由式④ - 式③可以得到式②,即满足:$$z^2 - y^2 = x^2$$
移项,可得:$$x^2 + y^2 = z^2$$
易知上式满足勾股定理,最小的勾股数为 \(3, 4, 5\)
\(\because i,j,k 满足式①\)
\(\therefore 最小解为 i=1,j=10,k=26\)
\(\therefore\) 当 \(n \leq 25\) 且 \(n\) 为奇数时无解;当 \(n \geq 27\) 时均有解,若 \(n\) 为奇数,将下标位置 \(1,10,26\) 的值均置为 \(1\),将下标位置 \(11,27\) 的值均置为 \(2\),其它的未构造的位置依次填入 \(3,3,4,4,..,\frac{n-5}{2},\frac{n-5}{2}\) 即为一组合法解。
参考代码
#include<bits/stdc++.h>
using namespace std;
int T, n;
void solve() {
cin >> n;
if (n & 1) {
if (n < 27) cout << "-1\n";
else {
bool flag = true;
for (int i = 1, j = 3; i <= n; ++ i) {
if (i == 1 || i == 10 || i == 26) cout << "1 ";
else if (i == 11 || i == 27) cout << "2 ";
else {
cout << j << ' ';
flag = !flag;
if (flag) ++ j;
}
}
cout << '\n';
}
return ;
}
for (int i = 0, j = 1; i < n; i += 2, ++ j) cout << j << ' ' << j << ' ';
cout << '\n';
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin >> T;
while (T --) {
solve();
}
return 0;
}
浙公网安备 33010602011771号