首页 > 其他分享 >CF1626F A Random Code Problem 题解

CF1626F A Random Code Problem 题解

时间:2023-09-01 20:22:22浏览次数:45  
标签:Code const 题解 valueType long T1 ans Problem mod

题意

给定长度为 \(n\) 的数组 \(a\) 和一个整数 \(k\) ,执行下面的代码:

long long ans = 0; //定义一个初始值为0的长整型变量
for(int i = 1; i <= k; i++) {
	int idx = rnd.next(0, n - 1); //生成一个介于0到n-1的随机数(含0和n-1)
  								 //每个数被选中的概率是相同的
	ans += a[idx];
	a[idx] -= (a[idx] % i);
}

求代码运行结束后 \(ans\) 的期望值 \(E\) 与 \(n^k\) 相乘的结果,即 \(E \times n^k\)。

(\(1 \le n \le 10^7, 1 \le k \le 17\))。

题解

考虑计算 \(ans\) 的期望值 \(E\),最后使之与 \(n^k\) 相乘。设 \(P = \operatorname{lcm}\left(1 \sim k - 1\right)\),可以看出数组 \(a\) 中的元素 \(a_i\) 最多会被减去 \(a_i \bmod P\)。因此若将 \(a_i\) 拆分为两部分:\(a_i = \left\lfloor\dfrac{a_i}{P}\right\rfloor \times P + a_i \bmod P\),前半部分的贡献是不变的,为

\[k \times \dfrac{P \times \sum\limits_{i = 0}^{n - 1}\left\lfloor\dfrac{a_i}{P}\right\rfloor}{n} \]

下面着重考虑后半部分的贡献,因为值域较小,故考虑将其作为 \(\texttt{DP}\) 的状态。设 \(f_{i, j}\) 为在第 \(i\) 次操作后模 \(P\) 为 \(j\) 的期望元素个数。有转移

\[\begin{aligned} f_{i, j - \left(j \bmod i\right)} &\leftarrow \dfrac{1}{n} \times f_{i - 1, j}\\ f_{i, j} &\leftarrow \left(1 - \dfrac{1}{n}\right) \times f_{i - 1, j} \end{aligned}\]

计算完成 \(f\) 数组后即可快速计算前半部分的贡献,为

\[\sum\limits_{i = 0}^{k - 1} \dfrac{\sum\limits_j j \times f_{i, j}}{n} \]

总复杂度 \(\mathcal{O}(n + kP)\),可以通过本题。

Code

#include <bits/stdc++.h>

typedef long long valueType;
typedef std::vector<valueType> ValueVector;
typedef std::vector<ValueVector> ValueMatrix;

constexpr valueType MOD = 998244353;

template<typename T1, typename T2, typename T3 = valueType>
void Inc(T1 &a, T2 b, const T3 &mod = MOD) {
    a = a + b;

    if (a >= mod)
        a -= mod;
}

template<typename T1, typename T2, typename T3 = valueType>
T1 sub(T1 a, T2 b, const T3 &mod = MOD) {
    return a - b < 0 ? a - b + mod : a - b;
}

template<typename T1, typename T2, typename T3 = valueType>
T1 mul(T1 a, T2 b, const T3 &mod = MOD) {
    return (long long) a * b % mod;
}

template<typename T1, typename T2, typename T3 = valueType>
void Mul(T1 &a, T2 b, const T3 &mod = MOD) {
    a = (long long) a * b % mod;
}

template<typename T1, typename T2, typename T3 = valueType>
T1 pow(T1 a, T2 b, const T3 &mod = MOD) {
    T1 result = 1;

    while (b > 0) {
        if (b & 1)
            Mul(result, a, mod);

        Mul(a, a, mod);
        b = b >> 1;
    }

    return result;
}

valueType lcm(valueType a, valueType b) {
    return a / std::__gcd(a, b) * b;
}

int main() {
    valueType N, A0, X, Y, K, M;

    std::cin >> N >> A0 >> X >> Y >> K >> M;

    ValueVector source(N);

    source[0] = A0;

    for (valueType i = 1; i < N; ++i)
        source[i] = (source[i - 1] * X + Y) % M;

    valueType P = 1;

    for (valueType i = 2; i < K; ++i)
        P = lcm(P, i);

    ValueMatrix F(K, ValueVector(P, 0));

    for (auto const &iter: source)
        ++F[0][iter % P];

    valueType const InvN = pow(N, MOD - 2), reverseN = sub(1, InvN);

    for (valueType k = 1; k < K; ++k) {
        for (valueType i = 0; i < P; ++i) {
            Inc(F[k][i - i % k], mul(F[k - 1][i], InvN));
            Inc(F[k][i], mul(F[k - 1][i], reverseN));
        }
    }

    valueType ans = 0;

    for (valueType k = 0; k < K; ++k)
        for (valueType i = 0; i < P; ++i)
            Inc(ans, mul(F[k][i], i));

    for (auto const &iter: source)
        Inc(ans, mul(iter / P * P, K));

    Mul(ans, InvN);

    Mul(ans, pow(N, K));

    std::cout << ans << std::endl;

    return 0;
}

标签:Code,const,题解,valueType,long,T1,ans,Problem,mod
From: https://www.cnblogs.com/User-Unauthorized/p/solution-CF1626F.html

相关文章

  • cURL error 60: SSL certificate problem: certificate has expired解决办法
    出现这个原因是因为Let’sEncrypt证书停止了HTTPAPI的请求支持,导致我们使用Let’sEncrypt证书的网站没办法更新证书,就出现了证书过期的提醒,所以我们只需要手动更新下证书就行了。1、下载https://curl.se/ca/cacert.pem 这个文件;2、将cacert.pem里面的内容替换到/wp-includ......
  • Educational Codeforces Round 5 A-E
    EducationalCodeforcesRound5垫底咯,中间老师找我去聊了下新学期的机房借用和训练,但出去前就只有我没出E目录EducationalCodeforcesRound5AComparingTwoLongIntegersBDinnerwithEmmaCTheLabyrinthDLongestk-GoodSegmentE-SumofRemaindersAComparingTwo......
  • idea插件easycode
    作为Java开发者,我们经常需要编写大量的重复性代码,例如实体类的属性、Getter和Setter方法、数据库操作代码等。这些繁琐的工作占用了我们宝贵的时间和精力,影响了开发效率。幸运的是,有一款强大的IDEA插件,名为EasyCode,可以帮助我们自动生成这些重复代码,极大地提升开发效率。在......
  • Maximum Diameter 题解
    MaximumDiameter题目大意定义长度为\(n\)的序列\(a\)的权值为:所有的\(n\)个点的第\(i\)个点的度数为\(a_i\)的树的直径最大值,如果不存在这样的树,其权值为\(0\)。给定\(n\),求所有长度为\(n\)的序列的权值和。思路分析\(n\)个点的树的边数为\(n-1\),总度数......
  • AtCoder Beginner Contest 317 C - Remembering the Days
    C-RememberingtheDays原题链接题意:每个点最多经过一次,求最长路思路:数据范围很小,深搜每个点能到其他点的所有路,取最大#include<bits/stdc++.h>usingnamespacestd;constintN=110;intg[N][N];intn,m;boolst[N];intw=0;intans=0;voiddfs(intu){ st[......
  • 【题解】Harbour.Space Scholarship Contest 2023-2024 D,E,F(CF1864)
    D.MatrixCascade题目描述:有一个大小为\(n\timesn\)的矩阵,由0和1组成。行的编号从上到下依次为\(1\)到\(n\),列的编号从左到右依次为\(1\)到\(n\)。第\(x\)行与第\(y\)列交叉处的单元格记为\((x,y)\)。水月想把矩阵的所有元素都变成0。她可以一步完成以下操作:选择任意......
  • kde桌面“屏幕边缘”无法触发问题解决
    鼠标放到屏幕边缘无法触发效果,搜索后是设置问题。解决办法:系统设置——硬件——显卡与显示器——显示特效合成器,勾选允许应用阻止显示特效合成,然后右下角点击应用参考:https://www.cnblogs.com/pipci/p/14870650.html......
  • 解决Ubuntu 安装出现E: Sub-process /usr/bin/dpkg returned an error code (1)异常(轮
     cd/var/lib/dpkg/sudomvinfo/info.bak#现将info文件夹更名sudomkdirinfo#再新建一个新的info文件夹sudoapt-getupdate#更新sudoapt-get-finstall#修复sudomvinfo/*info.bak/#执行完上一步......
  • vscode自动import导致报错
    vscode自动添加了这么一句import{Template}from"webpack";导致出现奇葩错误Can'tresolve'fs'in'/xxx/Desktop/ncpub/node_modules/.pnpm/[email protected]/node_modules/move-concurrentlyCan'tresolve'fs'in'/......
  • 重写equals为什么还要重写hashcode
    重写equals为什么还要重写hashcode1、为了保证一个原则,equals相同的两个对象hashcode必须相同。如果重写了equals而没有重写hashcode,会出现equals相同hashcode不相同这个现象。2、在散列集合中,是使用hashcode来计算key应存储在hash表的索引,如果重写了equals而没有重写hashcode,......