一、题目

点此看题

二、解法

直接推柿子吧:

\[\sum_{i=1}^n\sum_{j=1}^nf(\gcd(i,j))^k
\]
\[\sum_{d=1}^nf(d)^k\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}[(i,j)=1]
\]
\[\sum_{d=1}^nf(d)^k\sum_{x=1}^{n/d}\mu(x)\frac{n}{dx}\frac{n}{dx}
\]
\[\sum_{T=1}^n(\frac{n}{T})^2\sum_{d|T}f(d)^k\mu(\frac{T}{d})
\]

上面的式子就是普通的莫比乌斯反演,现在发现有些做不动了,算的时候外面可以套整除分块,但是里面就很难算的。因为 \(n\) 太大了所以不能预处理,我们考虑用筛法来做后面那个部分的前缀和。

设 \(h(i)=\sum_{d|i}f(d)\mu(\frac{i}{d})=f*\mu\) ,如果能求出 \(\sum_{i=1}^n h(i)\) 我们就成功了。考虑杜教筛,令辅助函数 \(g\) 为 \(I\) ,那么 \(g\) 的前缀和是很好求的,\(h*g=f*\mu*I=f\) ,它的前缀和虽然看上去还是很难,但是已经得到简化了。

求 \(f\) 的前缀和可以用 \(\tt Min25\) ,由于是次大的质因数产生贡献,所以我们可以在递归的时候,算每一个比他大的质数和他的贡献,也就是这个质数作为最大的质因子,他作为次大的质因子的贡献。还有一种情况是最大的质因子就是他,但是这要求次数要大于 \(1\) ,递归部分代码可以这样写:

int S(int x,int y)
{
if(x<=p[y]) return 0;//出口
int ans=pk[y]*(g[id(x)]-y)%MOD;//y一定是上一个质因数,这里我们算贡献,g是质数个数
for(int i=y+1;i<=cnt && p[i]*p[i]<=x;i++)//Min25
{
int pr=p[i];
for(int e=1;pr<=x;e++,pr*=p[i])
ans=(ans+S(x/pr,i)+(e!=1)*pk[i])%MOD;//如果次数大于1,那么可以直接贡献
}
return ans;
}

然后我们的杜教筛和 \(S(n,0)\) 都是需要记忆化的,由于我写自然溢出 \(\tt Wa\) 了,所以我只能暴力模了。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <map>
using namespace std;
const int N = 200000;
const int M = N+5;
#define int long long
const int MOD = 4294967296ll;
int read()
{
int x=0,f=1;char c;
while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
int n,k,cnt,tot,sqr,p[M],vis[M],pk[M],w[M];
int ans,g[M],p1[M],s1[M],p2[M],s2[M],id1[M],id2[M];
int qkpow(int a,int b)
{
int r=1;
while(b>0)
{
if(b&1) r=r*a%MOD;
a=a*a%MOD;
b>>=1;
}
return r;
}
void init(int n)
{
p[0]=pk[0]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++cnt]=i;
pk[cnt]=qkpow(i,k);
}
for(int j=1;j<=cnt && i*p[j]<=n;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
}
int id(int x)
{
if(x<=sqr) return id1[x];
return id2[n/x];
}
int S(int x,int y)
{
if(x<=p[y]) return 0;
int ans=pk[y]*(g[id(x)]-y)%MOD;
for(int i=y+1;i<=cnt && p[i]*p[i]<=x;i++)
{
int pr=p[i];
for(int e=1;pr<=x;e++,pr*=p[i])
ans=(ans+S(x/pr,i)+(e!=1)*pk[i])%MOD;
}
return ans;
}
int zy(int n)
{
if(p2[id(n)]) return s2[id(n)];
s2[id(n)]=S(n,0);p2[id(n)]=1;
return s2[id(n)];
}
int get(int n)
{
if(n<=1) return 0;
if(p1[id(n)]) return s1[id(n)];
int ans=zy(n);
for(int l=2,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=(ans-(r-l+1)*get(n/l))%MOD;
}
s1[id(n)]=ans;p1[id(n)]=1;
return ans;
}
signed main()
{
n=read();k=read();
init(N);sqr=sqrt(n);
for(int l=1,r;l<=n;l=r+1)
{
r=n/(n/l);//写错了
w[++tot]=n/l;
g[tot]=w[tot]-1;
if(n/l<=sqr) id1[n/l]=tot;
else id2[n/(n/l)]=tot;
}
for(int i=1;i<=cnt;i++)
for(int j=1;j<=tot && p[i]*p[i]<=w[j];j++)
g[j]-=g[id(w[j]/p[i])]-i+1;
for(int l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=(ans+(n/l)*(n/l)*(get(r)-get(l-1)))%MOD;
}
printf("%lld\n",(ans+MOD)%MOD);
}

[LOJ 572] Misaka Network 与求和的更多相关文章

  1. loj 572 Misaka Network 与求和 —— min_25筛

    题目:https://loj.ac/problem/572 推式子:https://www.cnblogs.com/cjoieryl/p/10150718.html 又学习了一下杜教筛hh: 原来 u ...

  2. 【LOJ#572】Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛)

    [LOJ#572]Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛) 题面 LOJ \[ans=\sum_{i=1}^n\sum_{j=1}^n f(gcd(i,j))^k\ ...

  3. LOJ 572 「LibreOJ Round #11」Misaka Network 与求和——min_25筛

    题目:https://loj.ac/problem/572 莫比乌斯反演得 \( ans=\sum\limits_{D=1}^{n}\left\lfloor\frac{n}{D}\right\rflo ...

  4. LOJ# 572. 「LibreOJ Round #11」Misaka Network 与求和(min25筛,杜教筛,莫比乌斯反演)

    题意 求 \[ \sum_{i = 1}^{n} \sum_{i = 1}^{n} f(\gcd(i, j))^k \pmod {2^{32}} \] 其中 \(f(x)\) 为 \(x\) 的次大质 ...

  5. Loj#572. 「LibreOJ Round #11」Misaka Network 与求和

    题目 有生之年我竟然能\(A\) 这个题求的是这个 \[\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k\] \(f(i)\)定义为\(i\)的次大质因子,其中\(f(p)= ...

  6. LOJ572: Misaka Network 与求和

    传送门 假设 \(f^k(i)\) 就是 \(f(i)\) 莫比乌斯反演得到 \[ans=\sum_{i=1}^{N}\lfloor\frac{N}{i}\rfloor^2\sum_{d|i}f(d) ...

  7. LOJ572. 「LibreOJ Round #11」Misaka Network 与求和 [莫比乌斯反演,杜教筛,min_25筛]

    传送门 思路 (以下令\(F(n)=f(n)^k\)) 首先肯定要莫比乌斯反演,那么可以推出: \[ ans=\sum_{T=1}^n \lfloor\frac n T\rfloor^2\sum_{d ...

  8. 可能是一篇(抄来的)min25学习笔记

    可能是一篇(抄来的)min25学习笔记 一个要求很多的积性函数 我们考虑有一个积性函数,这个函数满足可以快速计算质数处的值 且质数可以写成一个多项式的形式--而且这个多项式如果强行套在合数上,满足积性 ...

  9. Min_25 筛小结

    Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...

随机推荐

  1. c# 类(2)

    构造函数 和 析构函数 Constructors and destructors 构造函数是一个特殊的函数,当实例化一个类的时候自动调用这个函数,无返回值(不用定义返回类型)普通函数的定义 publi ...

  2. Java开发工程师最新面试题库系列——集合部分(附答案)

    集合 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 说说常见的集合有哪些? 答:主要分List.Set.Map.Queue四类,其中包含ArrayList.LinkedList.HashSe ...

  3. 图片转tfrecords

    import numpy as np import tensorflow as tf import time import os import cv2 from sklearn.utils impor ...

  4. js console.log all in one

    js console.log all in one this & arguments "use strict"; /** * * @author xgqfrms * @li ...

  5. shit 钉钉

    shit 钉钉 钉钉 圈子 入口, 没有 https://www.dingtalk.com/qidian/help-detail-1000131196.html shit bug 全员圈 这个好像是要 ...

  6. SSR & 轮询登录 & Token

    SSR & 轮询登录 & Token https://yuchengkai.cn/docs/frontend 扫码登录原理 https://www.cnblogs.com/xgqfrm ...

  7. css grid layout in practice

    css grid layout in practice https://caniuse.com/#search=grid subgrid https://caniuse.com/#search=cal ...

  8. py django

    创建项目 $ django-admin startproject server 运行项目 $ cd server $ python manage.py runserver 创建一个模块 $ pytho ...

  9. K8S线上集群排查,实测排查Node节点NotReady异常状态

    一,文章简述 大家好,本篇是个人的第 2 篇文章.是关于在之前项目中,k8s 线上集群中 Node 节点状态变成 NotReady 状态,导致整个 Node 节点中容器停止服务后的问题排查. 文章中所 ...

  10. java中的桥接方法

    本文转载自java中什么是bridge method(桥接方法) 导语 在看spring-mvc的源码的时候,看到在解析handler方法时,有关于获取桥接方法代码,不明白什么是桥接方法,经过查找资料 ...