首页 > 其他分享 >【题解】P3750 [六省联考 2017] 分手是祝愿

【题解】P3750 [六省联考 2017] 分手是祝愿

时间:2023-02-02 20:23:54浏览次数:48  
标签:六省 int 题解 frac maxn ans 操作 联考 mod

出题老哥收收味吧,阿米奈!

记一下几个常用的手段。

昨晚 CF 的 D 是差不多的思路吧,不然不会来做。

思路

期望 dp.

先做一些准备工作,求一下逆元和每个数的因数,复杂度 \(O(n \ln n)\).

考虑操作每个数得到的贡献。

  • 取反,意味着每个数最多被操作一次,转化成考虑选择若干数操作。

  • 操作因数,意味着每个数只能对小于等于它的数产生贡献,并且每个数的贡献是互异的。

  • 期望 dp,考虑倒推。

考虑到产生 \(k\) 次内的最优策略时,剩余操作的期望次数是 \(k\). 所以考虑构造最优策略,不然这个条件很难判定。

结合 2,降序考虑每个数的贡献对答案的正确性没有影响。从大到小考虑,如果当前数的位置是 \(1\),说明必须操作当前数。于是可以得到最优策略。

对于初始局面模拟一次,可以发现想要得到全 \(0\) 的局面,最终被操作的数是确定的,并且操作这些数的先后顺序不影响答案。

于是可以考虑设 \(f[i]\) 表示还有 \(i\) 个数需要操作时的期望步数。

这样转移有后效性,这里有一步比较巧妙:令 \(f[i]\) 表示从还有 \(i\) 个数需要操作转移到还有 \(i - 1\) 个数需要操作的期望步数。

那么操作到正确位置的概率是 \(frac{i}{n}\),代价是 \(1\);操作到错误位置的概率是 \(\frac{n - i}{n}\),代价是 \(f[i + 1] + f[i] + 1\).

所以 \(f[i] = \frac{n}{i} + \frac{n - i}{n} (f[i + 1] + f[i] + 1)\),整理得:

\(f[i] = \frac{n + (n - i) f[i + 1]}{i}\).

注意要分讨初始局面是否满足随机条件。

时间复杂度 \(O(n \ln n)\).

代码

#include <cstdio>
#include <vector>
using namespace std;

const int maxn = 1e5 + 5;
const int mod = 100003;

int n, k;
int a[maxn], f[maxn], inv[maxn];
vector<int> fac[maxn];

int main()
{
    scanf("%d%d", &n, &k);
    inv[1] = 1; for (int i = 2; i <= n; i++) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
    for (int i = 1; i <= n; i++)
        for (int j = i; j <= n; j += i)
            fac[j].push_back(i);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    int cnt = 0;
    for (int i = n; i >= 1; i--)
        if (a[i])
        {
            cnt++;
            for (int v : fac[i]) a[v] ^= 1;
        }
    for (int i = n; i >= 1; i--) f[i] = (n + 1ll * (n - i) * f[i + 1] % mod) % mod * inv[i] % mod;
    int ans = 0;
    if (cnt <= k) ans = cnt;
    else
    {
        for (int i = cnt; i >= k + 1; i--) ans = (ans + f[i]) % mod;
        ans = (ans + k) % mod;
    }
    for (int i = 1; i <= n; i++) ans = 1ll * ans * i % mod;
    printf("%lld\n", ans);
    return 0;
}

标签:六省,int,题解,frac,maxn,ans,操作,联考,mod
From: https://www.cnblogs.com/lingspace/p/p3750.html

相关文章

  • 【题解】[CSP-S2019] Emiya 家今天的饭
    题目分析:(我竟然可以独立做出来正赛的题,表示震惊)这个题面显然就很神仙,不好分析,我们进行转化一下题意:给定一个\(n\timesm\)的矩阵,对于每一行我们可以选择一个数也可以......
  • CF1311E 题解
    题意:构造一个节点数为\(n\)的树,使得节点深度之和为\(d\).(根节点为\(1\)且深度为\(0\))显然,不断构造二叉树并检查是否为答案是行不通的,只能在\(O(n)\)的......
  • [题解] P2685 [TJOI2012]桥 思路整理
    题目大意给一张\(n\)个点\(m\)条边的图,求删去一条边后最短路长度的最大值与对应删边方案数。思路首先考虑,如果删去的这条边不在原图最短路上,那么新图最短路长度与原......
  • 【题解】[FJOI2017]矩阵填数
    题目分析:最大值为\(v\)的限制显然可以转化为\(\lev\)的方案数减去\(\lev-1\)的方案数。因为这里有很多个这种限制所以直接容斥就好了,具体来说就是枚举哪些条件取......
  • 【题解】Luogu DTOI Round 4
    前言:好久不打洛谷的\(rated\)赛了,结果一打\(205,rk14\),看来是没有大佬来打。放一下链接:https://www.luogu.com.cn/contest/96429P8976「DTOI-4」排列题目分析:这个......
  • CF1037H Security题解
    根据字典序的定义,位置大的大于长度长的,长度长的大于长度短的。所以我们贪心,先追求长度长的,再追求后面的位置大的,再追求前面的位置大的。我们要一个能遍历子串的结构,就选......
  • 关于“等保保护”最常见问题解答!
    等保全称信息安全等级保护,它是网络安全体系中非常重要的组成部分。但很多人对等保不够了解,所以小编特整理了这篇文章,希望对你们有帮助。1、等级保护是强制性的吗?可......
  • 【题解】CF1770F Koxia and Sequence
    有没有觉得其他题解的模二Lucas逆用太智慧了,有没有觉得这题的第一思路是直接拆位算每一位是否有贡献,而不是先满足和的限制列式?这里提供另外一个做法。方向不同,结果一样......
  • Codeforces Round #848 (Div. 2) A~F 题解
    A.FlipFlopSum能换\(-1,-1\)就换,不能能换\(1,-1\)或\(-1,1\)也可以,否则只能换\(1,1\)。B.TheForbiddenPermutation如果原序列一开始就是好的那就结束,否则......
  • 关于github上README.md图片显示不出来的问题解决办法
    关于github上README.md图片显示不出来的问题解决办法出现原因:如果你的README文件内显示图片的路径是正确的,那么很有可能是因为DNS被污染了所以导致显示不正常,即无法访问存放......