PE 577 Counting hexagons
扣细节扣了30min,仔细观察了一会发现一个比较容易递推的式子
\(f(i)\)表示i行造成的六边形的数量。
就有递推式\[f(n) = f(n-1) + \sum_{s=1}^{\lfloor n/3\rfloor}s(n-3s+1)\]
考虑这样一张图
我们考虑新增加一行会贡献多少,显然只会增加以该行为底边的六边形,然后枚举一个长度,考虑该长度下会贡献多少。
我们先来看一下小的情况,即长度为2的情况
我们会发现有一个性质:当位于中间的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
*/