PE 577 Counting hexagons

PE 577 Counting hexagons

扣细节扣了30min,仔细观察了一会发现一个比较容易递推的式子
\(f(i)\)表示i行造成的六边形的数量。
就有递推式\[f(n) = f(n-1) + \sum_{s=1}^{\lfloor n/3\rfloor}s(n-3s+1)\]

考虑这样一张图
TIM截图20190307200258.png
我们考虑新增加一行会贡献多少,显然只会增加以该行为底边的六边形,然后枚举一个长度,考虑该长度下会贡献多少。
我们先来看一下小的情况,即长度为2的情况
FFT.png
我们会发现有一个性质:当位于中间的S边可以出现的话,那么一定可以形成三角形。
我们会发现,只有两边中间这一部分才能形成六边形,两边是不能形成的。
就是\(n - 3 * i + 1\),需要注意的是对于在这个底边的每一个点都会造成\(1\)的贡献.所以要乘上\(i\)(猜的题意,被题意卡了好久,mmp)

const int maxN = 10000000 + 7;
long long f[maxN];
int main() {
    int n = 12345;
    f[3] = 1;
    for(int i = 4;i <= n;++ i) {
        f[i] = f[i - 1];
        int tmp = i / 3;
        for(int j = 1;j <= tmp;++ j) {
            f[i] += (i - 3 * j + 1) * j;
        }
    }
    long long Sum = 0;
    for(int i = 1;i <= n;++ i) Sum += f[i];
    std::cout << Sum;
    return 0;
}
/*
ans:265695031399260211
*/

猜你喜欢

转载自www.cnblogs.com/gaozhuoyuan/p/10491940.html
PE