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;
}
posted @ 2026-10-17 19:05  SCX2014  阅读(3)  评论(0)    收藏  举报