题解:P12252 [蓝桥杯 2024 国 Java B] 七边形

· · 题解

水一发。

思路

很明显,这是一道递归题,那要怎么递归呢?很简单,先观察图形,可以发现,每一个图形都是一个大的七边形,套上上一个图形,我们把它拆分成几个部分:

我们先看红色部分,不难看出,第 i 个图形的红色部分的边上共有 7i 个点,同时重复了 7 个点。

再看蓝色(画圈)部分,可以知道,它是上一个图形。

再看黄色部分,可以看出,它是红色和蓝色部分的重合部分,我们可以找一下规律:

  1. 第一个图形:0
  2. 第二个图形:1
  3. 第三个图形:3
  4. 第四个图形:5

可以发现,第 i 个图形的黄色部分为 (i-1)\times2-1 个点。

全部加起来,结果算出来

设第 i 个图形总点数(小球数)为 f_i,则 f_i 为:

红色部分加上蓝色部分减去黄色部分

也就等于:(7i-7)+(f_{i-1})-((i-1)\times2+1)

化简:7i-7+f_{i-1}-2i+2+1

等于:5i-4+f_{i-1}

算完了,但是还有几个注意事项:

  1. 初始化 f_0=1
  2. C++古训:不开()见祖宗。

上代码:

#include<cstdio>
long long a[20240605];
int main(){
    a[1]=1;
    for(int i=2;i<=20240601;i++)a[i]=i*5ll+a[i-1]-4ll;
    printf("%lld\n",a[20240601]);//我是不会告诉你答案是1024204791742101的 
    return 0;
}