首页 > 其他分享 >题解 CF1876B

题解 CF1876B

时间:2024-02-05 22:34:20浏览次数:35  
标签:分数 所有 标记 CF1876B 题解 元素 因数 枚举

题意

给定一个数组 \([a_1,a_2,a_3.\cdots,a_n]\),一开始所有元素都为白色。你可以选定其中的至少一个元素涂成黑色,共有 \(2^n - 1\) 种涂法。此时对于所有黑色元素 \(a_i\) , 下标为 \(i\) 的倍数的所有白色元素都将变成绿色。此时数组中所有黑色和绿色元素的最大值记为此种涂法的分数。

问对于所有 \(a^n - 1\) 种涂法,每种涂法的分数之和为多少?

题解

我们考虑涂一个黑色元素 \(a_i\),记所有下标为 \(i\) 倍数的元素最大值为 \(a_{imax}\)。所有包含涂 \(a_i\) 的方法共有 \(2^{n-1}\) 种。但是这些方案中还可能涂了其他的黑色元素 \(a_j\),使得 \(a_{jmax} > a_{imax}\),所以计算 \(a_i\) 的贡献中还要剔除掉这些分数比 \(a_{imax}\) 大的方案数。

所以我们可以反着考虑,计算分数为 \(a_i\) 时的贡献。先将数组从大到小排序。\(a_i\) 作为方案的分数当且仅当 \(i\) 是某个黑色元素的下标倍数,所以我们枚举 \(i\) 的所有因数 \(k\)。如果 \(k\) 之前被更大的 \(a_j\) 枚举过,那么涂 \(a_k\) 的方案的分数肯定是 \(a_j\),不能记到分数为 \(a_i\) 的贡献里。如果 \(k\) 未被枚举过,那么此时 分数为 \(a_i\) 且涂了 \(a_k\) 的方案 的贡献为 所有包含 \(a_k\) 且不包含枚举过的数的方案数 乘 \(a_i\)(包含枚举过的数的方案,之前记过更大的分数)。

开一个标记数组标记枚举过的因数。将 \(a\) 数组从大到小排序。逐个考虑每一个 \(a_i\) 的所有因数,同时记录此时 \(1\) 至 \(n\) 中还未被标记的数的个数 \(t\):

  1. 统计未被标记的因数个数 \(b\),并标记这些因数。

  2. 记录 \(a_i\) 的贡献为 \(c_{a_i} = a_i\sum\limits_{j = 1}^{b}2^{t-j}\),再将 \(t\) 减 \(b\)。

所有包含 \(a_k\) 且不包含枚举过的数的方案数 即为其中的 \(2^{t - j}\)。这是因为此时还未标记的数还有 \(t - j\) 个,而真子集一共有 \(2^{t - j}\) 种。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 100010
#define MOD 998244353
#define REP(a, b, i) for(int i = (a); i <= (b); i++)

ll dn[MAXN];
bool vis[MAXN];
int n;

struct Ai{
    int ind;
    ll num;
}ai[MAXN];

bool cmp(Ai x, Ai y)
{
    return x.num > y.num;
}

void calc2n() // 预处理 2 的幂
{
    dn[0] = 1;
    REP(1, n, i)
        dn[i] = ((dn[i - 1] << 1) + MOD) % MOD;
}

ll factor(ll i) //找因数
{
    int cnt = 0;
    for(ll k = 1; k * k <= i; k++){
        if(i % k == 0){
            if(!vis[k]) vis[k] = 1, cnt++;
            if(!vis[i / k]) vis[i / k] = 1, cnt++;
        }
    }
    return cnt;
}

ll cntsum(ll lf, ll ct) // 计算第 2 步中的求和
{
    ll ans = 0;
    for(ll i = 1; i <= ct; i++)
        ans = (ans + dn[lf - i]) % MOD;
    return ans;
}

void work() 
{
    sort(ai + 1, ai + 1 + n, cmp);
    ll lft = n, res = 0; // lft 为尚未标记的数的个数
    for(int i = 1; i <= n; i++){
        ll k = factor(ai[i].ind);
        res = (res + cntsum(lft, k) * ai[i].num % MOD) % MOD;
        lft -= k;
    }
    cout << res;    
}

int main()
{
    cin >> n;
    calc2n();
    REP(1, n, i){
        ai[i].ind = i;
        cin >> ai[i].num;
    }
    work();
    return 0;
}

标签:分数,所有,标记,CF1876B,题解,元素,因数,枚举
From: https://www.cnblogs.com/anjack511/p/18008939/solution-CF1876-B

相关文章

  • 洛谷 P10145 [WC/CTS2024] 线段树 题解--zhengjun
    提供一种考场做法,在思路上和官方题解的差异蛮大的,虽然结果差不多。首先需要发现\([l,r)\)区间可以算出来的充要条件是:如果对于每个选中的节点\(u\),连无向边\((L_u,R_u)\),则当且仅当\(l\)和\(r\)连通时区间\([l,r)\)可以算出来。证明的话,用前缀和理解这些东西,分别考虑......
  • 题解 CF1849D
    萌新的第一篇题解题目大意对于一个初始颜色都为蓝色的数组\(a_1,a_2,\dots,a_n\)其中\(a_n\in\{0,1,2\}\),现在可以进行两个操作:花费\(1\)个金币,将\(a_i\)涂成红色;选择一个红色的\(a_i>0\),将\(a_{i-1}\)或\(a_{i+1}\)涂成红色,同时\(a_i\)减\(1\)。输出金......
  • F. 乘积最大(题解)
    题目今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:设有一个长度为......
  • [ARC135D] Add to Square 题解
    题目链接点击打开链接题目解法很牛的题!!!先考虑一步很牛的转化:把矩阵黑白染色,且\(i+j\)为奇数的位置的值取反,每次操作变为左上右下\(+v\),左下右上\(-v\)这样有啥好处?操作不会使行和列的和改变考虑答案的下界显然是:\(\max\{\)行的绝对值之和,列的绝对值之和\(\}\)这里给出......
  • luogu2647题解
    首先这道题没有规定选几个。一开始我以为是全选,然后想了个贪心才发现看错了。那我们先来假设选\(m\)个。这个题的每个物品都会影响后面物品的收益,不好看。由于每个物品\(i\)对后选的其他物品减少的收益都是\(R_i\),因此我们在保证总价值不变的情况下转化一下,把该物品的价......
  • P10125 「Daily OI Round 3」Simple 题解
    题目传送门简单模拟,主要考察字符串。首先输入一个char类型的数组,然后直接遍历每一位是否为Acoipp或Svpoll即可。//Simple//codeby:cq_irritater//time:2024/02/04#include<bits/stdc++.h>usingnamespacestd;chara[10];intmain(){//freopen("c......
  • 中文数字的应用及其问题解决之道
    中文数字,也称汉字数字,是中文语言中表示数字的一种方式。它们不仅有着悠久的历史和文化背景,还在日常生活中发挥着重要的作用。本文将探讨中文数字的应用领域,并介绍它们如何解决实际问题。中文数字-阿拉伯数字转换|一个覆盖广泛主题工具的高效在线平台(amd794.com)https:/......
  • P2367 语文成绩 题解
    语文成绩题目背景语文考试结束了,成绩还是一如既往地有问题。题目描述语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗?输入格式第一行有两个整数\(n\),\(p\),代表学生数与增加分数的次数。......
  • 题解 ARC171D【Rolling Hash】
    来补题了。昨天赛时想法是对的,代码写错了,没调过太可惜了。显然\(P>n\)时必定有解。设前缀\([1,i]\)的哈希值为\(s_i\),显然\([l,r]\)的哈希值不为\(0\)的充要条件是\(s_{l-1}\nes_r\)。建立一个点的编号为\(0\simn\)的图,对于每个输入的区间\([l,r]\),连接一条边......
  • 【洛谷 P2437】蜜蜂路线 题解(递归+记忆化搜索+高精度)
    蜜蜂路线题目描述一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房开始爬到蜂房,,有多少种爬行路线?(备注:题面有误,右上角应为)输入格式输入的值输出格式爬行有多少种路线样例#1样例输入#1114样例输出#1377提示对于100%的......