题目链接

题目

题目描述

“我不知道你在说什么,因为我只是个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 绿魔法师的更多相关文章

  1. Wannafly挑战赛27 D绿魔法师

    链接Wannafly挑战赛27 D绿魔法师 一个空的可重集合\(S\),\(n\)次操作,每次操作给出\(x,k,p\),要求支持下列操作: 1.在\(S\)中加入\(x\). 2.求\[\sum_{ ...

  2. 牛客 Wannafly挑战赛27 D 绿魔法师

    传送门 \(\color{green}{solution}\) 分析下,在\(1e5+1\)内,一个数的约数个数最多为\(2^{6}\)个,所以我们可以考虑枚举约数 复杂度\(O(N^{2^{6 \t ...

  3. [牛客Wannafly挑战赛27D]绿魔法师

    description newcoder 给你一个空的可重集合\(S\). \(n\)次操作,每次操作给出\(x\),\(k\),\(p\),执行以下操作: \(opt\ 1\):在S中加入x. \( ...

  4. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  5. wannafly 27 D 巧妙求取约数

    链接:https://www.nowcoder.com/acm/contest/215/D来源:牛客网 题目描述 “我不知道你在说什么,因为我只是个pupil.”--绿魔法师 一个空的可重集合S. n ...

  6. BZOJ-5055-膜法师(离散化+树状数组)

    Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...

  7. [BZOJ 5055]膜法师

    Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...

  8. bzoj5055 膜法师

    Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...

  9. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  10. bzoj 5055: 膜法师——树状数组

    Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...

随机推荐

  1. Verilog Review

    Agenda 目的 Verilog概述 Verilog建模 模块 模块组成 书写建议 时延 Verilog基本语法 标识符 可读性 注释 空格 数据类型 操作数 运算符 条件语句 循环语句 函数 Ve ...

  2. 08-逻辑仿真工具VCS-mismatch

    逻辑仿真工具VCS mismatch,预计的仿真结果和实际仿真结果不同,寻找原因? 首先考虑代码,,不要让代码跑到工具的盲区中 其次考虑仿真工具的问题 +race -- 将竞争冒险的情况写到文件中 不 ...

  3. 结构体Struct、联合体Union与类Class

    结构体Struct.联合体Union与类Class 1. Struct/Class struct能包含成员函数吗? 能! struct能继承吗? 能!! struct能实现多态吗? 能!!! 1.1 ...

  4. Python Code_04InputFunction

    代码部分 # coding:utf-8 # author : 写bug的盼盼 # development time : 2021/8/28 6:55 present = input('你想要什么?') ...

  5. 【面试题精讲】Java Stream排序的实现方式

    首发博客地址 系列文章地址 如何使用Java Stream进行排序 在Java中,使用Stream进行排序可以通过sorted()方法来实现.sorted()方法用于对Stream中的元素进行排序操作 ...

  6. [转帖]一文带你了解mysql sql model的only_full_group_by模式

    https://zhuanlan.zhihu.com/p/368440685 Mysql only_full_group_by与Error 1055问题分析 1 声明 本文的数据来自网络,部分代码也有 ...

  7. [转帖]从理论到实践,异步I/O模式下NVMe SSD高性能之道

    在早期NVMe的讨论话题中,常常将之AHCI协议进行对比,在支持的最大队列深度.并发进程数以及消耗时钟周期数等方面,NVMe吊打了AHCI.最直观也最权威的就是下面这张对比图片. NVMe与AHCI协 ...

  8. 【转帖】JVM的发展历程

    目录 1.Sun Classic VM 2.Exact VM 3.Sun HotSpot(主流) 4.JRockit 5.IBM J9 6.下一代虚拟机Graal VM 1.Sun Classic V ...

  9. [换帖]Linux命令之iconv命令

    一.命令简介   日常工作中我们需要将windows生成的文件上传到Linux系统,有时候会因为编码问题出现显示乱码.例如我上传了一个csv文件到Linux服务器上,默认编码为GB2312,在Linu ...

  10. 使用Configmap 配置 springboot的application.yaml文件的方式部署环境的方法

    Configmap部署k8s下Springboot服务的办法 前提 日常工作中需要使用k8s部署微服务环境, 但是内部的数据库连接和redis等连接非常麻烦,使用helm chart 进行变量替换时非 ...