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. 【POJ2182】Lost Cows

    [POJ2182]Lost Cows 题面 vjudge 题解 从后往前做 每扫到一个点\(i\)以及比前面小的有\(a[i]\)个数 就是查询当前的第\(a[i]+1\)小 然后查询完将这个数删掉 ...

  2. DSP5509的RTC实验-第3篇

    1. RTC实时时钟,不在过多介绍,本例程直接调用芯片支持库CSL的库函数,用起来比较简单 main() { CSL_init(); printf ("\nTESTING...\n" ...

  3. Ubuntu Server 下将HTML页面转换为PNG图片

    零.前言 最近做一个网站,需要将网页转换为图片.由于服务器是Ubuntu Server,没有图形界面,所以实现的过程中遇到了很多问题.记录下来备用. 一.安装CutyCapt CutyCapt是一个可 ...

  4. Linux命令应用大词典-第36章 密码和证书管理

    36.1 pwdhash:密码哈希生成器 36.2 mkpasswd:生成应用于用户的新密码 36.3 keytool:密钥和证书管理工具 36.4 certutil:证书服务器管理工具 36.5 v ...

  5. 第一模块·开发基础-第1章 Python基础语法

    Python开发工具课前预习 01 Python全栈开发课程介绍1 02 Python全栈开发课程介绍2 03 Python全栈开发课程介绍3 04 编程语言介绍(一) 05 编程语言介绍(二)机器语 ...

  6. (原) MaterialEditor部- UmateriaEditor中 Node编译过程和使用(3)

    @author: 白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ         说明 1.本篇是接着-----(原) MaterialEditor部- UmateriaE ...

  7. C#二次封装虹软arc研究

    相信很多用C#又想用虹软的SDK的童鞋要花很多心思去研究怎么转换,所以写了一篇文章和一个demo方便用C#的童鞋方便调用虹软的接口, 文章的地址是:https://blog.xgcos.com/sho ...

  8. Linux内核设计笔记8——下半部

    # 下半部笔记 1. 软中断 软中断实现 软中断是在编译期间静态分配,其结构如下所示,结构中包含一个接受该结构体指针作为参数的action函数. struct softirq_action{ void ...

  9. Python3 Tkinter-Label

    1.创建 from tkinter import * root=Tk() root.title('Hello tkinter!') root.mainloop() 2.使用内置位图 from tkin ...

  10. Redis+Keepalived高可用方案详细分析

    背景 目前,Redis集群的官方方案还处在开发测试中,未集成到稳定版中.且目前官方开发中的Redis Cluster提供的功能尚不完善(可参考官方网站或http://www.redisdoc.com/ ...