前言

「算法题解」系列致力于分享有价值的题目、探讨更优秀的解法。

这是本系列的第 24 篇题解,更多题解关注 Somnia1337@力扣。

在上周六,终于参加了期盼已久的蓝桥杯(Java A 组),但感觉题目略水,有点失望😒

Anyway,本周每天都更新一道题(两道填空放在一起)。

A. 拼正方形

题目描述

7385137888721 的方块和 10470245 的方块,求能拼出的正方形的最大边长。

解题思路

的方块给已经用 的方块拼成的大正方形“镶边”,每次使其边长加

public class Main {
    public static void main(String[] args) {
        final long SQ2 = 7385137888721L;
        final long SQ1 = 10470245L;
        
        // 用 2x2 的方块拼成一个大正方形
        long ans = (long) Math.sqrt(SQ2) * 2;
        
        // 用 1x1 的方块镶边
        long sq1 = SQ1;
        while (true) {
            if ((sq1 -= ans * 2 + 1) < 0) break;
            ans++;
        }
        
        System.out.println(ans);
    }
}

输出:

5435122

答案

5435122

B. 召唤数学精灵

题目描述

计算 的数量,满足:

  • 1 2024041331404202

其中,

解题思路

观察到 (赛后发现 即可),那么算式 就化简为

考虑 ,可以以 为一个周期,计算一个周期内 的次数,与周期数相乘。

1 ~ 2024041331404202 拆成 1 ~ 200201 ~ 2024041331404202 两部分:

  • 第一部分的特殊之处在于 ,它们都满足要求,而之后的例如 都不满足要求,因此额外加
  • 第二部分以每 一个周期,算得周期内有 满足要求(代码略),乘以总周期数。
public class Main {
    public static void main(String[] args) {
        final long ed = 2024041331404202L;
        
        // 分别计算两部分答案
        long ans1 = 4 + 2;
        long ans2 = (ed - 200) / 200 * 4;
        
        System.out.println(ans1 + ans2);
    }
}

输出:

40480826628086

答案

40480826628086