description

newcoder

给你一个空的可重集合\(S\)。

\(n\)次操作,每次操作给出\(x\),\(k\),\(p\),执行以下操作:

\(opt\ 1\):在S中加入x。

\(opt\ 2\):输出

\[\sum_{y\in S}gcd(x,y)^k
\]

data range

所有输入的数都是小于\(10^5+1\)的正整数。

solution

考场降智系列

对于一个\(x\),其\(gcd(x,y)\)有\(O(d(x))\le O(\sqrt x)\)个

这里\(d(x)\)指\(x\)的约数个数

枚举\(x\)的约数\(d\),考虑如何算出\(gcd(x,y)==d\)的\(y\)的个数

我们可以\(O(n\sqrt x)\)地动态维护集合\(S\)内\(i\)的倍数的数的个数\(p[i]\)。

但是\(d\)的倍数和\(x\)的\(gcd\)显然不一定是\(d\)。

这里有一个可能比较简单的容斥做法:

考虑一开始\(gcd(x,y)==x\)的数的个数肯定是\(=p[x]\)的。

于是可以在\(p[i<x]\)中减掉\(p[x]\).

之后\(x\)的次大的约数也会变成正确答案;

这样逐级做下去即可求出我们需要的答案。

复杂度?

看起来是\(O(n\sqrt n\sqrt{\sqrt n})=O(n^{\frac{7}{4}})\)的...

但是\(=O(能过)\)。

Code

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define Cpy(x,y) memcpy(x,y,sizeof(x))
#define Set(x,y) memset(x,y,sizeof(x))
#define FILE "a"
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ll;
typedef vector<int>VI;
//typedef long long ll;
typedef double dd;
const int N=2e5+10;
const int M=5e4+10;
const int mod=998244353;
const int base=113;
const dd eps=1e-8;
const int inf=1e9;
const ll INF=1ll<<60;
const ll P=100000;
#define mod (10007)
il int read(){
RG int data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
}
il void file(){
srand(time(NULL)+rand());
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
} inline int poww(int a,int b,int p){
RG int ret=1;
for(;b;b>>=1,a=1ll*a*a%p)
if(b&1)ret=1ll*ret*a%p;
return ret;
} int n,cnt[N],pw[N],cal[N],top,f[N];VI fac[N];
inline void sieve(){
for(RG int i=1;i<=100000;i++)
for(RG int j=i;j<=100000;j+=i)
fac[j].push_back(i);
} int main()
{
sieve();n=read();
for(RG int i=1,x,k,p,tmp,res,sz;i<=n;i++){
x=read();k=read();p=read();top=res=0;
sz=fac[x].size();
for(RG int j=0;j<sz;j++){
cnt[fac[x][j]]++;f[fac[x][j]]=cnt[fac[x][j]];
}
for(RG int j=sz-1;~j;j--)
for(RG int siz=fac[fac[x][j]].size(),k=siz-1;~k;k--)
if(fac[x][j]!=1&&fac[x][j]!=fac[fac[x][j]][k])
f[fac[fac[x][j]][k]]-=f[fac[x][j]];
for(RG int j=0;j<sz;j++)
{res+=1ll*f[fac[x][j]]*poww(fac[x][j],k,p)%p;if(res>=p)res-=p;}
printf("%d\n",res);
}
return 0;
}

[牛客Wannafly挑战赛27D]绿魔法师的更多相关文章

  1. 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)

    牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...

  2. 牛客~~wannafly挑战赛19~A 队列

    链接:https://www.nowcoder.com/acm/contest/131/A来源:牛客网 题目描述 ZZT 创造了一个队列 Q.这个队列包含了 N 个元素,队列中的第 i 个元素用 Qi ...

  3. 牛客Wannafly挑战赛23 B.游戏

    游戏 题目描述 小N和小O在玩游戏.他们面前放了n堆石子,第i堆石子一开始有ci颗石头.他们轮流从某堆石子中取石子,不能不取.最后无法操作的人就输了这个游戏.但他们觉得这样玩太无聊了,更新了一下规则. ...

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

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

  5. 牛客 Wannafly 挑战赛26D 禁书目录 排列组合 概率期望

    原文链接https://www.cnblogs.com/zhouzhendong/p/9781060.html 题目传送门 - NowCoder Wannafly 26D 题意 放一放这一题原先的题面 ...

  6. 牛客Wannafly挑战赛26E 蚂蚁开会(树链剖分+线段树)

    传送门 题面描述 一颗n个节点的树,m次操作,有点权(该节点蚂蚁个数)和边权(相邻节点的距离). 三种操作: 操作1:1 i x将节点i的点权修改为x.(1 <= i <= n; 1 &l ...

  7. 牛客Wannafly挑战赛11E 白兔的刁难

    传送门 如果大力推单位根反演就可以获得一个 \(k^2logn\) 的好方法 \[ans_{t}=\frac{1}{k}\sum_{i=0}^{k-1}(w_k^{-t})^i(w_k^i+1)^n\ ...

  8. 牛客Wannafly挑战赛23F 计数(循环卷积+拉格朗日插值/单位根反演)

    传送门 直接的想法就是设 \(x^k\) 为边权,矩阵树定理一波后取出 \(x^{nk}\) 的系数即可 也就是求出模 \(x^k\) 意义下的循环卷积的常数项 考虑插值出最后多项式,类比 \(DFT ...

  9. 牛客Wannafly挑战赛13-BJxc军训-费马小定理、分式取模、快速幂

    参考:https://blog.csdn.net/qq_40513946/article/details/79839320 传送门:https://www.nowcoder.com/acm/conte ...

随机推荐

  1. nodejs 实现套接字服务

    nodejs实现套接字服务     一 什么是套接字 1.套接字允许一个进程他通过一个IP地址和端口与另一个进程通信,当你实现对运行在同一台服务器上的两个不同进程的进程间通信或访问一个完全不同的服务器 ...

  2. Windows运行机理——主程序—WinMain

    Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 在windows 操作系统下,用C 或者C++来编写MS-DOS 应用 ...

  3. 怎样通过Qt编写C/C++代码查询当前Linux的版本号?

    遇到一个问题:如题. 我的开发环境是:嵌入式ARM + Linux系统 + Qt 4.5 + C/C++ 现在需要查询 当前Linux系统的版本号. 问题: 1)Qt 4.5 提供怎样的API来获取? ...

  4. Linux命令应用大词典-第35章 终端

    35.1 tty:显示当前连接到当前标准输入的终端设备文件名 35.2 consoletype:显示连接到标准输入的控制台类型 35.3 fgconsole:显示活动的虚拟终端数量 35.4 ming ...

  5. Micro:bit 硬件架构介绍

    Micro:bit做为当红的少儿编程工具,这两年在编程教育领域越来越火.今天就从硬件架构开始,分享Micro:bit的相关主题. Microbit 硬件设计是根据ARM mbed技术所开发的应用IC及 ...

  6. python学习笔记03 --------------程序交互与格式化输出

    1.读取用户输入内容 语法:input() 例: name = input('你的名字是?) print('你好'+name) 程序会等待用户输入名字后打印:你好(用户输入的名字) 注意:input接 ...

  7. JDK源码分析:Integer.java部分源码解析

    1)声明部: public final class Integer extends Number implements Comparable<Integer> extends Number ...

  8. django启动创建用户失败

    a django应用启动 b 访问127.0.0.1:8000,报错信息如下,原因为没有这个用户需要创建下用户 c 创建用户过程中报错原因是因为添加了app需要告诉django,这个 模型发生了改变, ...

  9. asp.net mvc5 模式的现象思考

    .net mv5简化了一些应用逻辑,与其说是mvc架构模式,不如说应用.net Entity更好. 现在你只需要去随便创建一个类 相关数据 然后用一个类去继承 DbContext 定义一个 DbSet ...

  10. centos环境配置(nginx,node.js,mysql)

    1.安装 Install GCC and Development Tools on a CentOS yum group install "Development Tools" n ...