专栏文章

题解:P13964 [VKOSHP 2024] Colony of Bacteria

P13964题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio0f089
此快照首次捕获于
2025/12/02 11:19
3 个月前
此快照最后确认于
2025/12/02 11:19
3 个月前
查看原文
提供一个 O(1)O(1) 的解法。
由于题目的增量与秒数的奇偶性有关,我们索性按奇偶分情况讨论。我们只需要求出从 11kk 所有奇数秒对于前一秒的增量之和 sumOddsum_{Odd} ,以及所有偶数秒对于前一秒的增量之和 sumEvensum_{Even} ,最后将两者相加即为答案。

先来看 kk 为奇数的情况:

第一列表示秒数 第二列表示这一秒对于上一秒的增量。
秒数增量
11
312
524
736
不难发现,这一秒的增量就是 k2×12\left \lfloor \frac{k}{2} \right \rfloor\times12 的结果。 我们要计算的是从 11kk 所有奇数秒对于前一秒的增量之和,也就是 sumOddsum_{Odd} 。不难发现其实就是
1+12×(1+2+3+4+......k2)1+12\times(1+2+3+4+......\left \lfloor \frac{k}{2} \right \rfloor)
我们利用等差数列求和公式很容易就能 O(1)O(1) 算出。 我们称 nnk2\left \lfloor \frac{k}{2} \right \rfloor
1+12×(n×(n+1)2)1+12\times(\frac{n\times(n+1)}{2})
=1+6n(n+1)=1+6n(n+1)

再来看 kk 为偶数的情况:

第一列表示秒数 第二列表示这一秒对于上一秒的增量。
秒数增量
28
424
640
856
依旧发现增量是 8×(k1)8\times(k-1) 。 我们要计算的是从 11kk 所有偶数数秒对于前一秒的增量之和,也就是 sumEvensum_{Even} 。不难发现其实就是
8×(1+3+5+7+......(k1))8\times(1+3+5+7+......(k-1))
=8×k×k22=8\times \frac{k\times \frac{k}{2}}{2}
=2k2=2k^2
接下来只需要计算 sumOddsum_{Odd}sumEvensum_{Even} 的和即可。若 kk 为偶数,那么额外计算一下 11k1k-1sumOddsum_{Odd} 即可,反之同理。
下面是代码。
CPP
#include <bits/stdc++.h>
using namespace std;
int main(){
	long long k;
	cin>>k;
	if(k&1){
		long long n=k/2;
		long long sum_Odd=1+6*n*(n+1);
		long long sum_Even=(k-1)*(k-1)*2;
		cout<<sum_Odd+sum_Even;
	}else{
		long long sum_Even=k*k*2;
		long long n=(k-1)/2;
		long long sum_Odd=1+6*n*(n+1);
		cout<<sum_Odd+sum_Even;
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...