• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【勾股定理】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;
}

posted on 2026-03-21 22:00  RomanLin  阅读(2)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3