Codeforces Round 305 (Div. 1) C. Mike and Foam 容斥原理、质因数分解

题目链接

题目大意

n n n 种啤酒,编号从 1 1 1 n n n 。第 i i i 瓶啤酒上面有 a i a_{i} ai 毫升的泡沫。

回答 q q q 个查询。最初架子是空的。在每个操作中,给一个编号 X X X。如果编号为 X X X的啤酒已经在架子上,应该从架子上取下它,否则他应该把它放在架子上。
每次询问后,输出该架子的分数。他们认为货架的分数是满足 i < j i<j i<j 并且 g c d ( a i , a j ) = 1 gcd(a_{i},a_{j})=1 gcd(ai,aj)=1的数对 ( i , j ) (i,j) (i,j)的个数。

n n n q q q 1 ≤ n 1\le n 1n q ≤ 2 × 10 5 q\le 2\times {10}^{5} q2×105),不同种类的啤酒数量和查询次数。

下一行包含 n n n个由空格分隔的整数, a 1 , a 2 , … , a n a_{1},a_{2},\dots,a_{n} a1,a2,,an( 1 ≤ a i ≤ 5 × 1 0 5 1\le a_{i}\le 5\times10^{5} 1ai5×105 ),表示各种啤酒顶部的泡沫量。

接下来 q q q 行一行包含一个查询。每个查询一个整数 X X X 1 ≤ X ≤ N 1\le X\le N 1XN),表示应从货架上添加或移除的啤酒的编号。

思路

考虑添加或移除走某个数之后 a n s ans ans 的变化量。

比如当前有 k k k 个数,加入一个数 x x x 只考对 a n s ans ans 增量,考虑容斥 △ = \bigtriangleup = = k − c n t ( g c d k-cnt(gcd kcnt(gcd ≠ \neq = 1 ) 1) 1) ,当 k k k 中某个数与 x x x 具有公共因子时 g c d ≠ 1 gcd \neq 1 gcd=1

任意一个数 n n n 都可以表示为 n = p 1 α 1 ⋅ p 2 α 2 ⋅ ⋅ ⋅ p k α k n=p_1^{\alpha 1} \cdot p_2^{\alpha 2} \cdot \cdot \cdot p_k^{\alpha k} n=p1α1p2α2pkαk ,只需要关注质因数的种类,又因为 1 ≤ a i ≤ 5 × 1 0 5 1\le a_{i}\le 5\times10^{5} 1ai5×105 2 ∗ 3 ∗ 5 ∗ 7 ∗ 11 ∗ 13 ∗ 17 = 510510 > 1 0 5 2*3*5*7*11*13*17=510510 > 10^{5} 2357111317=510510>105,故 p p p 的种类最多有六个,那也就是最多有 2 6 2^6 26 种组合,时间复杂度 O ( q ∗ 2 6 ) O(q*2^{6}) O(q26)

code

#include <bits/stdc++.h>
#define int long long
#define ll long long
#define pii pair<int, int>

using namespace std;
const int N = 5e5 + 1000;
int prime[N], sum[N], cnt = 0;
bool st[N], vis[N];
vector<int> p[N];
int ans = 0;

void is_prime(int n)
{
    for (int i = 2; i <= n; ++i)
    {
        if (!st[i])
            prime[cnt++] = i;
        for (int j = 0; j < cnt && i * prime[j] <= n; ++j)
        {
            st[i * prime[j]] = 1;
            if (i % prime[j] == 0)
                break;
        }
    }
}

void query(int x, int op)
{
    for (int i = 0; i < (1ll << p[x].size()); ++i)
    {
        int now = 1, num = 0;
        for (int j = 0; j < p[x].size(); ++j)
            if ((1ll << j) & i)
                now *= p[x][j], num++;
        if (num & 1)
            ans -= op * sum[now];
        else
            ans += op * sum[now];
    }
}

void updata(int x, int op)
{
    for (int i = 0; i < (1ll << p[x].size()); ++i)
    {
        int now = 1;
        for (int j = 0; j < p[x].size(); ++j)
            if ((1ll << j) & i)
                now *= p[x][j];
        sum[now] += op;
    }
}
void solve()
{
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; ++i)
    {
        int x;
        cin >> x;
        for (int j = 0; j < cnt && prime[j] <= sqrt(x); ++j)
        {
            if (x % prime[j] == 0)
            {
                p[i].push_back(prime[j]);
                while (x % prime[j] == 0)
                    x /= prime[j];
            }
        }
        if (x > 1)
            p[i].push_back(x);
    }
    while (q--)
    {
        int x;
        cin >> x;
        if (!vis[x])
            query(x, 1), updata(x, 1);
        else
            updata(x, -1), query(x, -1);
        cout << ans << '\n';
        vis[x] ^= 1;
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    is_prime(5e5 + 10);
    int t = 1;
    while (t--)
        solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git基础之工作原理

基础概念 git本地有三个工作区域&#xff0c;工作目录 Working Directory&#xff0c;暂存区Stage/Index和资源区Repository/Git Directory&#xff0c;如果在加上远程的git仓库就是四个工作区域 四个区域与文件交换的命令之间的关系 WorkSpace&#xff1a;工作区&#xff0c;就…

【计算机网络】计算机网络的性能指标——时延、时延带宽积、往返时延、信道利用率

计算机网络的性能指标 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我们介绍了计算机网络的三个性能指标——速率、带宽和吞吐量。用大白话来说就是&#xff1a;网速、最高网速和实时网速。 相信大家看到这三个词应该就…

测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试

前言 当今各种大语言模型百花齐放&#xff0c;为了方便使用者更加自由的使用大模型&#xff0c;将大模型变成如同棒球棍一样每个人都能用&#xff0c;并且顺手方便的工具&#xff0c;本地私有化具有重要意义。 本次测试使用ollama完成模型下载&#xff0c;过程简单快捷。 1、进…

【实战篇】【DeepSeek 全攻略:从入门到进阶,再到高级应用】

凌晨三点,某程序员在Stack Overflow上发出灵魂拷问:“为什么我的DeepSeek会把财务报表生成成修仙小说?” 这个魔性的AI工具,今天我们就来场从开机键到改造人类文明的硬核教学。(文末含高危操作集锦,未成年人请在师父陪同下观看) 一、萌新村任务:把你的电脑变成炼丹炉 …

【Linux学习笔记】Linux基本指令分析和权限的概念

【Linux学习笔记】Linux基本指令分析和权限的概念 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…

Unity DOTS从入门到精通之 自定义Authoring类

文章目录 前言安装 DOTS 包什么是Authoring1. 实体组件2. Authoring类 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世…

linux如何判断进程对磁盘是随机写入还是顺序写入?

模拟工具&性能测试工具&#xff1a;fio fio参数说明&#xff1a; filename/dev/sdb1&#xff1a;测试文件名称&#xff0c;通常选择需要测试的盘的data目录。 direct1&#xff1a;是否使用directIO&#xff0c;测试过程绕过OS自带的buffer&#xff0c;使测试磁盘的结果更真…

olmOCR:高效精准的 PDF 文本提取工具

在日常的工作和学习中&#xff0c;是否经常被 PDF 文本提取问题困扰&#xff1f;例如&#xff1a; 想从学术论文 PDF 中提取关键信息&#xff0c;却发现传统 OCR 工具识别不准确或文本格式混乱&#xff1f;需要快速提取商务合同 PDF 中的条款内容&#xff0c;却因工具不给力而…

Leetcode 刷题记录 06 —— 矩阵

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 矩阵置零 方法一&#xff1a;标记数组 方法二&#xff1a;两个标记变量 02 螺旋矩阵…

Elasticsearch:使用 BigQuery 提取数据

作者&#xff1a;来自 Elastic Jeffrey Rengifo 了解如何使用 Python 在 Elasticsearch 中索引和搜索 Google BigQuery 数据。 BigQuery 是 Google 的一个平台&#xff0c;允许你将来自不同来源和服务的数据集中到一个存储库中。它还支持数据分析&#xff0c;并可使用生成式 AI…

如何在el-input搜索框组件的最后面,添加图标按钮?

1、问题描述 2、解决步骤 在el-input组件标签内&#xff0c;添加一个element-plus的自定义插槽&#xff0c; 在插槽里放一个图标按钮即可。 3、效果展示 结语 以上就是在搜索框组件的末尾添加搜索按钮的过程。 喜欢本篇文章的话&#xff0c;请关注本博主~~

Magento2根据图片文件包导入产品图片

图片包给的图片文件是子产品的图片&#xff0c;如下图&#xff1a;A104255是主产品的sku <?php/*** 根据图片包导入产品图片&#xff0c;包含子产品和主产品* 子产品是作为主图&#xff0c;主产品是作为附加图片*/use Magento\Framework\App\Bootstrap;include(../app/boot…

INT_MAX 与 0x3f3f3f3f 的区别

【INT_MAX 与 0x3f3f3f3f 的区别】 在算法设计中&#xff0c;INT_MAX 与 0x3f3f3f3f 都常被用作无穷大值的设定&#xff0c;但二者区别显著&#xff0c;适用场景也有所不同。 备注&#xff1a;此图由百度 AI 创作生成 &#xff08;1&#xff09;INT_MAX 是 C/C 中的标准常量&a…

升级旧版本Vmware到Vmware Workstation Pro 17

背景 一些新版本Linux内核版本较高&#xff0c;例如&#xff1a;openEuler24.03 LTS需要的内核版本为6.6&#xff0c;而Vmware Workstation Pro 16最高只支持Linux5.x内核&#xff0c;对Linux6.x不支持&#xff0c;因此&#xff0c;需要将旧版本的Vmware升级到Vmware Workstat…

【第23节】C++设计模式(行为模式)-Interpreter(解释器)模式

一、问题背景 在一些应用中&#xff0c;系统会提供内建&#xff08;Build-In&#xff09;的脚本或宏语言&#xff0c;允许用户定义他们能够在系统中执行的操作。Interpreter 模式的目的就是为用户提供一种定义语言的语法表示&#xff0c;并通过解释器来解释语言中的句子。这种模…

哈弗赛恩公式计算长度JavaScript实现

哈弗赛恩公式&#xff08;Haversine formula&#xff09;是一种用于计算球面上两点间最短距离的数学方法&#xff0c;尤其适用于地球表面。本文将详细介绍哈弗赛恩公式的原理、应用以及如何使用JavaScript实现它。 一、哈弗赛恩公式原理 在球面几何中&#xff0c;哈弗赛恩公式…

Day05 实例:正向反向连接内外网环境防火墙出入站

一、正反向连接 0、先将防火墙关闭 Linux&#xff1a; sudo systemctl stop firewalld Windows&#xff1a;netsh advfirewall set allprofiles state off 1、正向连接 1.1 Linux连接Windows 00x1 开启两台服务器 并且给Windows拖入nc.exe 00x2 Windows绑定自己5566端…

【大模型知识点】位置编码——绝对位置编码,相对位置编码,旋转位置编码RoPE

由于Transformer 中的自注意模块具有置换不变性&#xff08;不关心输入序列的顺序&#xff09;&#xff0c;因此需要使用位置编码来注入位置信息以建模序列&#xff0c;使模型能够区分不同位置的 token&#xff0c;并捕捉序列的顺序关系。 在介绍一些位置编码方法前&#xff0…

Linux 配置静态 IP

一、简介 在 Linux CentOS 系统中默认动态分配 IP 地址&#xff0c;每次启动虚拟机服务都是不一样的 IP&#xff0c;因此要配置静态 IP 地址避免每次都发生变化&#xff0c;下面将介绍配置静态 IP 的详细步骤。 首先先理解一下动态 IP 和静态 IP 的概念&#xff1a; 动态 IP…

DeepSeek 3FS:端到端无缓存的存储新范式

在 2025 年 2 月 28 日&#xff0c;DeepSeek 正式开源了其高性能分布式文件系统 3FS【1】&#xff0c;作为其开源周的压轴项目&#xff0c;3FS 一经发布便引发了技术圈的热烈讨论。它不仅继承了分布式存储的经典设计&#xff0c;还通过极简却高效的架构&#xff0c;展现了存储技…