Walrus
2024-11-17 14:28:00
致敬传奇构造题。
首先知道一个很简单的结论,
举例:若
所以说,若题目中给的
如果是奇数,怎么办?
这里肯定至少要选一个数出现次数为奇数了。
这里考虑如果一个数出现次数为奇数还满足题目条件会有什么性质。
题目说的是,对于任意二元组
这样的话,如果跟完全平方数沾边,自然会想到勾股定理。
有啥关系呢?我们知道勾股定理的内容是在一个直角三角形中,直角边的平方和等于斜边的平方。
考虑将这个结论转移到序列上。
不难发现,我们假设有
那么考虑最小的勾股数组合
同时我们也可以发现,如果
但是可以发现,如果我们可以采取一个办法,将区间元素个数变成偶数,是不是就可以解决了。
区间中间的元素肯定是不能乱动的,只能套结论。我们发现区间两头的元素是不是有可能和
然后你就可以发现,若
所以结论如下。
偶数一定有解,对于
27 及以上的奇数一定有解,反之无解。
code
只放奇数端点写法。
int l1 = 11, l2 = 25,
r1 = 27, r2 = n;
int d1 = r1 - l1,
d2 = r1 - l2;
int e1 = r2 - l1,
e2 = r2 - l2;
if((int)sqrt(d1) * (int)sqrt(d1) == d1) {
a[l1] = a[r1] = 1e6 - 1;
int tot = 5;
rep(i, 12, 25) {
a[i] = a[i + 1] = tot;
++tot, ++i;
}
rep(i, r1 + 1, r2) {
a[i] = a[i + 1] = tot;
++tot, ++i;
}
}
else if((int)sqrt(d2) * (int)sqrt(d2) == d2) {
a[l2] = a[r1] = 1e6 - 1;
int tot = 5;
rep(i, 11, 24) {
a[i] = a[i + 1] = tot;
++tot, ++i;
}
rep(i, r1 + 1, r2) {
a[i] = a[i + 1] = tot;
++tot, ++i;
}
}
else if((int)sqrt(e1) * (int)sqrt(e1) == e1) {
a[l1] = a[r2] = 1e6 - 1;
int tot = 5;
rep(i, 12, 25) {
a[i] = a[i + 1] = tot;
++tot, ++i;
}
rep(i, r1, r2 - 1) {
a[i] = a[i + 1] = tot;
++tot, ++i;
}
}
else if((int)sqrt(e2) * (int)sqrt(e2) == e2) {
a[l2] = a[r2] = 1e6 - 1;
int tot = 5;
rep(i, 12, 25) {
a[i] = a[i + 1] = tot;
++tot, ++i;
}
rep(i, r1, r2 - 1) {
a[i] = a[i + 1] = tot;
++tot, ++i;
}
}
两个区间左右端点两两组合有