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. Android stado 运行项目,apk does not exist on disk.

    报错如下: 03/12 21:38:56: Launching iReader The APK file F:\git\iReader_nubia\iReader\build\outputs\apk\ ...

  2. Mac brew安装redis

    1.安装redis $ brew install redis Error:Failed to download resource "reds"  // 下载reds失败 不过不需要 ...

  3. InnoDB锁冲突案例演示(续)

      Preface       I've demontstrated several InnoDB locking cases in my previous blog.I'm gonna do the ...

  4. 围绕DOM元素节点的增删改查

    HTML 文档中的所有内容都是节点: 整个文档是一个文档节点 document 每个 HTML 元素是元素节点 element HTML 元素内的文本是文本节点 每个 HTML 属性是属性节点 注释是 ...

  5. Selenium 入门到精通系列:二

    Selenium 入门到精通系列 PS:用户登录 例子 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-04-23 16:12 ...

  6. linux部署MantisBT(二)部署php

    二.部署php 1.下载php安装包 http://php.net/downloads.php 2.安装php yum install libxml2 yum install libxml2-deve ...

  7. Objective-C Block数据类型 @protocol关键字

    Block数据类型 Block封装了一段代码 可以在任何时候执行 Block可以作为函数参数或者函数的返回值 而其本身又可以带输入参数或返回值 苹果官方建议尽量多用Block 在多线程 异步任务 集合 ...

  8. (C#)工厂方法模式

    1.工厂方法模式 第一了一个用于创建对象的接口,让子类自己决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. *工厂方法模式即克服了简单工厂模式违反开放-封闭原则的缺点,又保留了封装对象创建过 ...

  9. 【WXS数据类型】RegExp

    生成 regexp 对象需要使用 getRegExp函数,注意与JS的使用方法不同( new RegExp(pattern,modifiers);) 原型:getRegExp(pattern, mod ...

  10. OpenMPI源码剖析1:MPI_Init初探

    OpenMPI的底层实现: 我们知道,OpenMPI应用起来还是比较简单的,但是如果让我自己来实现一个MPI的并行计算,你会怎么设计呢?————这就涉及到比较底层的东西了. 回想起我们最简单的代码,通 ...