题解:P16233 [蓝桥杯 2026 省 B] 双碳战略
CDSuperDuo · · 题解
前言
五年级蒟蒻的大号被封,心态调整后的第一次写题解,也是第一次用小号写题解。
这是一道再简单不过的题了 (细节:B 组的填空题居然比 A 组的难度高一点)。
题目大意
有
操作规则如下:
- 奇数次操作(第
1,3,5,\dots 次):选定一盏路灯i ,翻转它及其右侧(后方)所有路灯的状态。 - 偶数次操作(第
2,4,6,\dots 次):选定一盏路灯i ,翻转它及其左侧(前方)所有路灯的状态。
其中所有
对于每种状态,定义它的“最少操作次数”为从初始全亮状态到达该状态所需的最少指令数(初始状态的最少操作次数为
题目要求我们计算出所有
解题思路
我们可以发现以下性质:
- 奇数次操作会影响后缀
[i,n] 。 - 偶数次操作会影响前缀
[1,i] 。
操作序列与最终状态一一对应。
通过分析(或者也可以造小数据手动模拟)可以得到:对于
具体推导如下:
这里假设
考虑第
- 如果是亮的:则它被翻转了偶数次。此时前
n-1 盏灯可以取任何状态,最少操作次数等于前n-1 盏灯的最少操作次数。共2^{n-1} 种状态,贡献为f(n-1) 。 - 如果是暗的:则它被翻转了奇数次。此时前
n-1 盏灯也可以取任何状态,但是我们需要在对应状态的基础上额外加上1 次操作(以n 为起点),因为以n 为起点的操作只影响第n 盏灯(不影响前面),所以在前n-1 盏灯的最优解后面追加一次以n 为起点的操作,就得到第n 盏为暗的最优解,且步数恰好+1 。共2^{n-1} 种状态,贡献为f(n-1) + 2^{n-1} 。
因此:
又因为
所以最终答案就是
怎么得出结果呢?你可以尝试使用计算器,这样的话你就会被判为作弊者啦。因此我们可以使用快速幂来解决。
AC Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MOD=998244353;
int ksm(int a,int b,int mod)
{
int res=1;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
signed main()
{
int n=2026;
int ans=n*ksm(2,n-1,MOD)%MOD;
cout<<ans;
return 0;
}
十年 OI 一场空,不开 long long 见祖宗。