首页 > 其他分享 >AT_agc038_c 做题笔记

AT_agc038_c 做题笔记

时间:2023-10-15 11:33:43浏览次数:38  
标签:limits cdot sum 笔记 mu int agc038 mod

题目链接

莫反好题,不仅仅是莫反,还有很多思维含量。

由于推式子过程太过于漫长了,所以我仅仅讲下大概。

题目是给你一个长度为 $n$ 的数组,请求出 $\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n \operatorname{lcm}(A_i, A_j)$

莫反通常是对于值域考虑,直接推是不可行的,所以开一个桶 $b$,$b_k$ 存储 $A_i=k$ 的个数。

对值域分类的话就只能把忽略大小关系的 $i$ $j$ 对算出来后再容斥得到答案,即:

$\sum\limits_{i=1}^V\sum\limits_{j=1}^V \operatorname{lcm}(i,j)\cdot b_i \cdot b_j$。

多说一句,我刚开始没忽略大小关系,是 $\sum\limits_{i=1}^V\sum\limits_{j=i+1}^V \operatorname{lcm}(i,j)\cdot b_i \cdot b_j$,但这个实际上是错的,我当时没注意,推到最后发现没办法推了才想到这个办法的。。。

推式子,大概就是先把 $\operatorname{lcm}$ 变成相乘除以最大公约数之后枚举最大公约数,然后再同时除以最大公约数,然后再用莫比乌斯反演之后再枚举。

此时有一个整除的条件,枚举的时候枚举倍数就行了,最后把所有 $\sum$ 内的能拿出来的都拿出来,用乘法分配律拿。

推完后是:$\sum\limits_{d=1}^V d\cdot \sum\limits_{x=1}^{\lfloor\frac{V}{d}\rfloor}\cdot \mu(x)\cdot x^2\cdot\sum\limits_{i=1}^{\lfloor\frac{V}{dx}\rfloor}i\cdot b_{i\cdot d\cdot x}\cdot \sum\limits_{j=1}^{\lfloor\frac{V}{dx}\rfloor}j\cdot b_{j\cdot d\cdot x}$。

此时令 $f(x)=\sum\limits_{i=1}^{\lfloor\frac{V}{x}\rfloor}i\cdot b_{i\cdot x}$,然后就可以化为 $\sum\limits_{d=1}^V d\cdot \sum\limits_{x=1}^{\lfloor\frac{V}{d}\rfloor} \mu(x)\cdot x^2\cdot f^2(dx)$。

对 $f$ 进行预处理,然后调和级数 $n\log n$ 就可求得,注意最后要除以二,用逆元,还有减去 $\sum_{i=1}^n a_i$,因为我们多算了要容斥掉。

代码:

#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, x, ans, cnt;
int b[1000005], f[1000005];
int mu[1000005], primes[200005];
bool prime[1000005];
const int mod = 998244353;
void init () {
    mu[1] = 1;
    For (i, 2, 1000000) {
        if (!prime[i]) {
            primes[++ cnt] = i;
            mu[i] = -1;
        }
        for (int j = 1; j <= cnt && i * primes[j] <= 1000000; j ++) {
            prime[i * primes[j] ] = 1;
            if (i % primes[j] == 0) break;
            mu[i * primes[j] ] = -mu[i];
        }
    }
}
void solve () {
    init ();
    cin >> n;
    For (i, 1, n) {
        cin >> x;
        ans -= x;
        ++ b[x];
    }
    ans = (ans % mod + mod) % mod;
    For (i, 1, 1000000) {
        For (j, 1, 1000000 / i) f[i] += j * b[i * j];
        f[i] %= mod;
    }
    For (i, 1, 1000000) {
        int x = 1000000 / i, res = 0;
        For (j, 1, x) {
            res += mu[j] * j * j % mod * f[i * j] % mod * f[i * j] % mod;
            if (res >= mod) res -= mod;
            if (res <= mod) res += mod;
        }
        ans += i * res % mod;
        if (ans >= mod) ans -= mod;
    }
    cout << ans * 499122177 % mod;
}
signed main () {
    int _ = 1;
//    cin >> _;
    while (_ --) {
        solve ();
        cout << '\n';
    }
    return 0;
}

 

标签:limits,cdot,sum,笔记,mu,int,agc038,mod
From: https://www.cnblogs.com/Xy-top/p/17765445.html

相关文章

  • 20211128《信息安全系统设计与实现》第十一章学习笔记
    一、任务内容1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核心是要求GPT:“请你以苏格拉底的方式对我进行提问”然后GPT......
  • 学习笔记:TPGNN
    MultivariateTime-SeriesForecastingwithTemporalPolynomialGraphNeuralNetworks利用时间多项式图神经网络的多时间序列预测期刊:NIPS2022作者:YijingLiu, QinxianLiu, Jian-WeiZhang, HaozheFeng, ZhongweiWang, ZihanZhou, WeiChen论文:https://openrevie......
  • 第十一章学习笔记
    EX2文件系统数据结构EXT2文件系统TheSecondExtendedFileSystem(ext2)文件系统是linux系统中的标准文件系统。多年来,Linux一直使用EXT2作为默认文件系统。EXT3是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,它将文件系统的变更记录在日志中。日志可###在文件系统崩溃时......
  • java学习笔记day03
    java学习笔记day03数据类型public class 数据类型 {  public static void main(String[] args){    //整数类型    byte num1 = 10;    short num2 = 200;    int num3 = 3000;    long num4 = 400000L;    ......
  • 学习笔记5
    第十一章EXT2文件系统创建虚拟磁盘mke2fs[-bblksize-Nninodes]devicenblocks虚拟磁盘布局Block#0:引导块B0是引导块,文件系统不使用超级块Block#1超级块B1是超级块,用于容纳整个文件系统的信息超级块的重要字段u32s_inodes_count://文件系统中节点总数......
  • 《信息安全系统设计与实现》第六周学习笔记
    《信息安全系统设计与实现》第六周学习笔记第十一章EXT2文件系统EXT2文件系统EXT2第二代扩展文件系统(英语:secondextendedfilesystem,缩写为ext2),是LINUX内核所用的文件系统。它开始由RémyCard设计,用以代替ext,于1993年1月加入linux核心支持之中。EX2文件系统数据结构......
  • 学习笔记5
    11章教材知识点EXT2概述:EXT2是一种磁盘文件系统,用于存储和组织文件和目录。支持文件和目录的权限、链接、文件系统的挂载和卸载等功能。使用磁盘上的数据结构来组织文件和目录的存储。EXT2数据结构:虚拟磁盘:通过mkfs命令创建的EXT2文件系统。虚拟磁盘布局:由超级块、......
  • 《信息安全系统设计与实现》学习笔记5
    第十一章EXT2文件系统EXT2文件系统数据结构通过mkfs创建虚拟磁盘mke2fs[-bblksize-Nninodes]devicenblocks虚拟磁盘布局Block#0:引导块。用来容纳一个引导程序,从磁盘引导操作系统。超级块Block#1:超级块。用于容纳整个文件系统的信息。超级块结构中的一些重要字......
  • 《Unix/Linux系统编程》教材学习笔记第十一章
    chapter11EXT2文件系统Linux一直使用EXT2(Card等1995)作为默认文件系统。EXT3(EXT3,2014)是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,它将文件系统的变更记录在日志中。日志可在文件系统崩溃时更快地从错误中恢复。没有错误的EXT3文件系统与EXT2文件系统相同。EXT3的最新......
  • *【学习笔记】(7) 线段树及高级用法
    一.普通线段树线段树(SegmentTree)几乎是算法竞赛最常用的数据结构了,它主要用于维护区间信息(要求满足结合律)。与树状数组相比,它可以实现\(O(logn)\)的区间修改,还可以同时支持多种操作(加、乘),更具通用性。接下来我们用这道模板题为例,看看线段树是怎么维护区间和这一信息的。P33......