题解:P16233 [蓝桥杯 2026 省 B] 双碳战略

· · 题解

前言

五年级蒟蒻的大号被封,心态调整后的第一次写题解,也是第一次用小号写题解。

这是一道再简单不过的题了 (细节:B 组的填空题居然比 A 组的难度高一点)

题目大意

2026 盏路灯,开始时全都是亮的(状态为 1)。

操作规则如下:

其中所有 2^{2026} 种不同的明暗状态都可以通过若干次操作到达。

对于每种状态,定义它的“最少操作次数”为从初始全亮状态到达该状态所需的最少指令数(初始状态的最少操作次数为 0)。

题目要求我们计算出所有 2^{2026} 种状态的最少操作次数之和,并对 998244353 取模。

解题思路

我们可以发现以下性质:

操作序列与最终状态一一对应。

通过分析(或者也可以造小数据手动模拟)可以得到:对于 n 盏灯,所有状态的最少操作次数之和为 n \times 2^{n-1}

具体推导如下:

这里假设 f(n) 表示 n 盏灯时所有状态的最少操作次数之和。

考虑第 n 盏灯最后的状态:

因此:

f(n) = 2 \times f(n-1) + 2^{n-1}

又因为 f(1) = 1,递推得:

f(n) = n \times 2^{n-1}

所以最终答案就是

2026 \times 2^{2025} \bmod 998244353

怎么得出结果呢?你可以尝试使用计算器,这样的话你就会被判为作弊者啦。因此我们可以使用快速幂来解决。

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 见祖宗。