[LOJ 572] Misaka Network 与求和
一、题目
二、解法
直接推柿子吧:
\]
\]
\]
\]
上面的式子就是普通的莫比乌斯反演,现在发现有些做不动了,算的时候外面可以套整除分块,但是里面就很难算的。因为 \(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 与求和的更多相关文章
- loj 572 Misaka Network 与求和 —— min_25筛
题目:https://loj.ac/problem/572 推式子:https://www.cnblogs.com/cjoieryl/p/10150718.html 又学习了一下杜教筛hh: 原来 u ...
- 【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\ ...
- 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 ...
- 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\) 的次大质 ...
- 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)= ...
- LOJ572: Misaka Network 与求和
传送门 假设 \(f^k(i)\) 就是 \(f(i)\) 莫比乌斯反演得到 \[ans=\sum_{i=1}^{N}\lfloor\frac{N}{i}\rfloor^2\sum_{d|i}f(d) ...
- 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 ...
- 可能是一篇(抄来的)min25学习笔记
可能是一篇(抄来的)min25学习笔记 一个要求很多的积性函数 我们考虑有一个积性函数,这个函数满足可以快速计算质数处的值 且质数可以写成一个多项式的形式--而且这个多项式如果强行套在合数上,满足积性 ...
- Min_25 筛小结
Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...
随机推荐
- c# 类(2)
构造函数 和 析构函数 Constructors and destructors 构造函数是一个特殊的函数,当实例化一个类的时候自动调用这个函数,无返回值(不用定义返回类型)普通函数的定义 publi ...
- Java开发工程师最新面试题库系列——集合部分(附答案)
集合 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 说说常见的集合有哪些? 答:主要分List.Set.Map.Queue四类,其中包含ArrayList.LinkedList.HashSe ...
- 图片转tfrecords
import numpy as np import tensorflow as tf import time import os import cv2 from sklearn.utils impor ...
- js console.log all in one
js console.log all in one this & arguments "use strict"; /** * * @author xgqfrms * @li ...
- shit 钉钉
shit 钉钉 钉钉 圈子 入口, 没有 https://www.dingtalk.com/qidian/help-detail-1000131196.html shit bug 全员圈 这个好像是要 ...
- SSR & 轮询登录 & Token
SSR & 轮询登录 & Token https://yuchengkai.cn/docs/frontend 扫码登录原理 https://www.cnblogs.com/xgqfrm ...
- css grid layout in practice
css grid layout in practice https://caniuse.com/#search=grid subgrid https://caniuse.com/#search=cal ...
- py django
创建项目 $ django-admin startproject server 运行项目 $ cd server $ python manage.py runserver 创建一个模块 $ pytho ...
- K8S线上集群排查,实测排查Node节点NotReady异常状态
一,文章简述 大家好,本篇是个人的第 2 篇文章.是关于在之前项目中,k8s 线上集群中 Node 节点状态变成 NotReady 状态,导致整个 Node 节点中容器停止服务后的问题排查. 文章中所 ...
- java中的桥接方法
本文转载自java中什么是bridge method(桥接方法) 导语 在看spring-mvc的源码的时候,看到在解析handler方法时,有关于获取桥接方法代码,不明白什么是桥接方法,经过查找资料 ...