Loj#572. 「LibreOJ Round #11」Misaka Network 与求和
有生之年我竟然能\(A\)
这个题求的是这个
\]
\(f(i)\)定义为\(i\)的次大质因子,其中\(f(p)=1,f(1)=0\)
看到这道题的第一反应肯定是这东西TM还能求
习惯性反演
\]
\]
\]
现在处理后面那个\(\mu\times f\)的前缀和就可以整除分块了
看到数据范围不小,考虑杜教筛,在卷上一个\(I\),把\(\mu\)消掉
于是就有
\]
发现只需要求出\(\sum_{i=1}^nf(i)^k\)就可以杜教筛了
这个东西显然可以被Min_25处理,就是算次大质因子的时候贡献算成\(k\)次方即可
代码
#include <tr1/unordered_map>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define maxn 3000005
#define re register
#define LL unsigned long long
using namespace std::tr1;
unordered_map<LL,LL> ma;
LL n,p[maxn],w[maxn],id1[maxn],id2[maxn],K,mu[maxn],Sqr;
LL m,f[maxn],tot,F[maxn][2],pre[maxn],D[maxn],g[maxn];
inline LL quick(LL a,LL b) {LL s=1;while(b) {if(b&1ll) s*=a;b>>=1ll;a*=a;}return s;}
inline LL S(LL x,int y) {
if(x<=1&&p[y]>x) return 0;
LL ans=0;
for(re int k=y;k<=tot&&1ll*p[k]*p[k]<=x;k++) {
LL p1=p[k];
for(;p1<=x;p1*=p[k]) {
ans+=S(x/p1,k+1);
LL t=g[(x/p1<=Sqr)?id1[x/p1]:id2[n/(x/p1)]];
if(t+1>k) ans+=(t+1-k)*D[p[k]];
}
}
return ans;
}
LL calc(LL x) {
if(x<=Sqr) return pre[x];
if(ma[x]) return ma[x];
LL cnt=S(x,1)+g[id2[n/x]];
for(re LL l=2,r;l<=x;l=r+1) {
r=x/(x/l);cnt-=(r-l+1)*calc(x/l);
}
return ma[x]=cnt;
}
int main()
{
scanf("%u%u",&n,&K);Sqr=std::pow(n,0.666);
for(re LL l=1,r;l<=n;l=r+1) {
r=n/(n/l);w[++m]=n/l;
if(w[m]<=Sqr) id1[w[m]]=m;else id2[n/w[m]]=m;
g[m]=w[m]-1;
}
f[1]=1;D[1]=1;mu[1]=1;
for(re int i=2;i<=Sqr;i++) {
if(!f[i]) p[++tot]=i,D[i]=quick(i,K),mu[i]=-1;
for(re int j=1;j<=tot&&p[j]*i<=Sqr;j++) {
f[p[j]*i]=1;if(i%p[j]==0) break;mu[p[j]*i]=-1*mu[i];
}
}
for(re int j=1;j<=tot&&1ll*p[j]*p[j]<=n;j++)
for(re int i=1;i<=m&&1ll*p[j]*p[j]<=w[i];i++) {
int k=(w[i]/p[j]<=Sqr)?id1[w[i]/p[j]]:id2[n/(w[i]/p[j])];
g[i]=g[i]-g[k]+j-1;
}
memset(f,0,sizeof(f));f[1]=1;
for(re int i=2;i<=Sqr;i++){
if(f[i]) continue;
F[i][1]=1;
for(re int j=i+i;j<=Sqr;j+=i) f[j]=1,F[j][1]=F[j][0],F[j][0]=i;
}
for(re int i=2;i<=Sqr;i++)
if(f[i]&&!F[i][1]) F[i][1]=F[i][0];
for(re int i=2;i<=Sqr;i++)
if(f[i]&&(i/F[i][0])%F[i][0]==0) F[i][1]=F[i][0];
for(re int i=1;i<=Sqr;i++)
for(re int j=i;j<=Sqr;j+=i)
pre[j]+=mu[j/i]*D[F[i][1]];
for(re int i=1;i<=Sqr;i++) pre[i]+=pre[i-1];
LL now=0;
for(re LL l=1,r;l<=n;l=r+1) {
r=n/(n/l);
now+=(n/l)*(n/l)*(calc(r)-calc(l-1));
}
printf("%u",(unsigned int)now);
return 0;
}
Loj#572. 「LibreOJ Round #11」Misaka Network 与求和的更多相关文章
- 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\) 的次大质 ...
- 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 ...
- [LOJ#530]「LibreOJ β Round #5」最小倍数
[LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...
- [LOJ#516]「LibreOJ β Round #2」DP 一般看规律
[LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...
- [LOJ#531]「LibreOJ β Round #5」游戏
[LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
- [LOJ#525]「LibreOJ β Round #4」多项式
[LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...
- [LOJ#526]「LibreOJ β Round #4」子集
[LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...
随机推荐
- plpgsql insert 性能 测试
有时需要执行一些sql脚本,带逻辑控制语句,又不想用高级语言C#.Java之类的,可以直接用plpgsql,类似于Oracle的plsql. do language 'plpgsql' $$ decl ...
- 第四章使用java实现面向对象-接口
一.接口 1.接口可以看作是一种特殊的“抽象类”. 2.接口有比抽象类更好的特性 3.可以被多继承 4.设计和实现完全分离 5.更自然的使用多态 二.接口约定 1.接口表示一种约定:体现在接口名称和注 ...
- Java基础(六)包装类
一.包装类 JAVA是一种面向对象语言,java中的类把方法与数据连接在一起,但在JAVA中不能定义基本类型对象,为了能将基本类型视为对象进行处理,java为每个基本类型都提供了包装类. 对应关系如下 ...
- 基数排序——Java实现
一.基数排序思想 相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作.基数 排序是一种按记录关键字的各位值逐步进行排序的方法.此种排序一般适用于记录的关键字为整数类型的情况. ...
- java温故而知新(6)深入理解IO Stream
一.什么是IO Stream Stream 是在编程语言中对输入输出的总称 (一种比喻的称谓.Stream 为流水,输入输出实际上就是指数据的流动,数据由一个地方运动的另一个地方,就像流水一样,程序员 ...
- Nginx 503错误总结
nginx 503错误(Service Temporarily Unavailable 服务暂时不可用): 503是一种HTTP状态码,由于临时的服务器维护或者过载,服务器当前无法处理请求.这个状况 ...
- 基于easyUI实现系统日志管理
此文章是基于 EasyUI+Knockout实现经典表单的查看.编辑 一. 相关文件介绍 1. log.jsp:系统日志管理界面 <!DOCTYPE html PUBLIC "-//W ...
- bootstrap-datepicker汉化
bootstrap-datepicker 是一个非常优秀的时间选择插件,默认是英文显示日期的,通过下面几个小修改让其支持默认中文 1.首先将 bootstrap-datepicker.js 另存为 u ...
- IntelliJ IDEA快速创建属性字段的get和set方法
1.写好属性字段后,在代码面板右击,选择generator… 再选择 Getter and Setter 全选中(Ctrl + A),点击OK! 2.也可以选择使用快捷键:alt+inse ...
- 139.00.009提高Github Clone速度
@(139 - Environment Settings | 环境配置) Method 1 :SS+系统内置代理 用 git 内置代理,直接走系统中运行的代理工具中转,比如,你的 SS 本地端口是 1 ...