NC20812 绿魔法师
题目
题目描述
“我不知道你在说什么,因为我只是个pupil。”--绿魔法师
一个空的可重集合S。
n次操作,每次操作给出x,k,p,执行以下操作:
1、在S中加入x。
2、输出 \(\sum_{y \in S}{gcd(x,y)^k} (mod p)\) 。
输入描述
所有输入的数都是小于1e5+1的正整数。
输出描述
输出对应的结果
示例1
输入
3
4 1 9
5 2 8
6 3 7
输出
4
2
1
题解
知识点:因数集合,GCD与LCM,容斥原理,枚举。
每次插入一个数 \(x\) 时,因为 \(\gcd(y,x)\) 的值一定不会出现 \(x\) 因数之外的数,所以考虑枚举这个数的因数 \(d\) 作为 \(\gcd(x,y)\) 时的贡献,即有多少个 \(y\) 满足条件。
我们先预处理出数据范围内所有数的因数,用 \(cnt_d\) 表示整个集合中存在因数 \(d\) 的数的个数,方便之后计数。
因为是最大公约数,应该先考虑较大数的贡献,计算完较大数后,在计算较小数时应减去较大数的影响,所以我们从大到小枚举因数,同时对较小因数做一个容斥。
因此,每次加入一个数 \(x\) 时,用 \(tot_d\) 表示 \(gcd(y,x) = d\) 中 \(y\) 的个数,即 \(d\) 产生的贡献。那么, \(tot_d\) 应该等于 \(cnt_d\) 减去它所有是 \(x\) 的因数的倍数 \(d'\) 的贡献 \(tot_{d'}\) ,即 \(\displaystyle tot_d = cnt_d - \sum_{d \mid d',d'|x} tot_{d'}\) 。这个可以在我们遇到 \(d'\) 时对它的因数贡献减去 \(tot_{d'}\) 来维护。
最后,对于一个因数 \(d\) 产生的贡献为 \(tot_d \cdot d^k\) ,累和即可。
复杂度的上界确实是 \(O(n \max\{x\})\) ,但是跑不满,因为因数个数的上界 \(O(\sqrt {\max\{x\}})\) 是非常松的,这里的总计算量级差不多 \(10^8\) 。
时间复杂度 \(O(n \cdot \max\{x\})\)
空间复杂度 \(O(1)\)
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector<int> factor[100007];
void get_factor(int n) {
for (int i = n;i >= 1;i--)
for (int j = 1;i * j <= n;j++)
factor[i * j].push_back(i);
}
int qpow(int a, int k, int P) {
int ans = 1;
while (k) {
if (k & 1) ans = 1LL * ans * a % P;
k >>= 1;
a = 1LL * a * a % P;
}
return ans;
}
int cnt[100007];//S中i的倍数的个数
int tot[100007];//gcd(x,y)=i的y的个数,通过容斥维护
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
get_factor(100000);
int n;
cin >> n;
for (int i = 1;i <= n;i++) {
int x, k, p;
cin >> x >> k >> p;
int ans = 0;
for (auto d : factor[x]) {
tot[d] += ++cnt[d];// 以d为gcd的个数 = d的倍数个数 - d的倍数作为gcd的数字个数
if (!tot[d]) continue;
(ans += 1LL * tot[d] * qpow(d, k, p) % p) %= p;
int tmp = tot[d];
for (auto dd : factor[d]) tot[dd] -= tmp; // 给dd减去的其倍数d作为gcd的数字个数
}
cout << ans << '\n';
}
return 0;
}
NC20812 绿魔法师的更多相关文章
- Wannafly挑战赛27 D绿魔法师
链接Wannafly挑战赛27 D绿魔法师 一个空的可重集合\(S\),\(n\)次操作,每次操作给出\(x,k,p\),要求支持下列操作: 1.在\(S\)中加入\(x\). 2.求\[\sum_{ ...
- 牛客 Wannafly挑战赛27 D 绿魔法师
传送门 \(\color{green}{solution}\) 分析下,在\(1e5+1\)内,一个数的约数个数最多为\(2^{6}\)个,所以我们可以考虑枚举约数 复杂度\(O(N^{2^{6 \t ...
- [牛客Wannafly挑战赛27D]绿魔法师
description newcoder 给你一个空的可重集合\(S\). \(n\)次操作,每次操作给出\(x\),\(k\),\(p\),执行以下操作: \(opt\ 1\):在S中加入x. \( ...
- Wannafly挑战赛27
Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...
- wannafly 27 D 巧妙求取约数
链接:https://www.nowcoder.com/acm/contest/215/D来源:牛客网 题目描述 “我不知道你在说什么,因为我只是个pupil.”--绿魔法师 一个空的可重集合S. n ...
- BZOJ-5055-膜法师(离散化+树状数组)
Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...
- [BZOJ 5055]膜法师
Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...
- bzoj5055 膜法师
Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...
- BZOJ_5055_膜法师_树状数组+离散化
BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...
- bzoj 5055: 膜法师——树状数组
Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...
随机推荐
- Redis 缓存常见问题
本文为博主原创,未经允许不得转载: 目录: 1. 缓存穿透 1.1 出现原因 1.2 解决方案 1.3 布隆过滤器 2. 缓存雪崩 3. 缓存失效(缓存击穿,热点缓存) 1. 缓存穿透: 缓存穿透是指 ...
- IDEA控制台输出中文乱码
1.问题 如下图,我使用的文件编码格式为UFT-8,这里会出现中文乱码的问题. 且我并不方便直接修改全局文件编码格式,有可能会造成未知错误. 2.解决 参考链接:IDEA 控制台中文乱码 4 种解决方 ...
- jenkins构建报错: Send build artifacts over SSH' changed build result to UNSTABLE
原因包括: ssh配置的用户没有相关的权限. 最好是配置root用户
- Spring——静态/动态代理模式
代理模式 代理模式: 静态代理 动态代理 学习aop之前,要先了解代理模式 静态代理 抽象角色:一般使用接口或者抽象类来实现 真实角色:被代理的角色 代理角色:代理真实角色:代理真实角色后,一般会做一 ...
- linux环境C语言实现:h264与pcm封装成AVI格式
前言 拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题. RIFF和AVI以及WAV格式,可以参考前面的一些文章.这里详细介绍将一个H264视 ...
- [转帖]Archery
Archery SQL 审核查询平台 文档 | FAQ | Releases 功能清单 数据库 查询 审核 执行 备份 数据字典 慢日志 会话管理 账号管理 参数管理 数据归档 My ...
- [转帖]PowerShell教程 - 日期时间管理(Date & Time Management)
https://www.cnblogs.com/cqpanda/p/16589991.html 更新记录转载请注明出处.2022年8月25日 发布.2022年8月18日 从笔记迁移到博客. 日期时间管 ...
- openssh 修改版本号显示
#背景介绍:G端项目经常收到相关漏洞但有时升级最新版本(8.8p)还是会有相关漏洞(CVE-2020-15778),只能禁用相关命令或修改版本号 #漏洞名称OpenSSH 命令注入漏洞(CVE-202 ...
- /dev/null 先后顺序的问题
https://blog.csdn.net/x1131230123/article/details/114317752
- docker -- images镜像消失问题排查
1. 问题描叙 安装model-serving组件时,错误日志输出push时对应的tag不存在,导致镜像推送失败 2. 问题排查 # 找到对应镜像,尝试手动推送 docker images|grep ...