P16814 [蓝桥杯 2026 国 Python B] 蓝桥大富翁 题解
题目大意
给定一个数组,最开始时 \(a_i=i\)。接着有 \(2026\) 轮变换,每次变换使 \(a_i\leftarrow\frac{\prod_{j=1}^{n}a_j}{a_i}\),求 \(2026\) 轮变换后 \(\prod_{i=1}^na_i\) 的值。
算法分析
如果直接按题目模拟,那么时间复杂度就是 \(O(n^3)\),显然会超时。
初始时数组总积为 \(\prod_{i=1}^na_i\),我们定义对于每一轮变换后的数组为 \(b\),以下为推导过程。
\(\begin{aligned}\prod_{i=1}^nb_i &=\prod_{i=1}^{n}\frac{\prod_{j=1}^n{a_j}}{a_i}\\ &=\frac{\prod_{i=1}^{n}\prod_{j=1}^n{a_j}}{\prod_{i=1}^{n}a_i}\\ &=\frac{\prod_{i=1}^{n}{a_i}^{n}}{\prod_{i=1}^{n}a_i}\\ &=\prod_{i=1}^{n}{a_i}^{n-1} \end{aligned}\)
那么每次变换乘积就会这样 \(\prod_{i=1}^na_i\leftarrow\prod_{i=1}^{n}{a_i}^{n-1}\),所以不用管什么数组不数组,只要处理乘积就行了。
时间复杂度:\(O(n^2)\)。
#include<bits/stdc++.h>
using namespace std;//参考代码
const long long mod=998244353;
int main(){
std::ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
long long num=1;
for(long long i=2;i<=2026;i++){
num=(num*i)%mod;
}
for(long long i=1;i<=2026;i++){
long long numm=1;
for(long long j=1;j<=2025;j++){
numm=(numm*num)%mod;
}
num=numm;
}
cout<<num;
return 0;
}

浙公网安备 33010602011771号