正题

题目链接:https://www.luogu.com.cn/problem/P6222


题目大意

给出\(k\),\(T\)组询问给出\(n\)求

\[\sum_{i=1}^n\sum_{j=1}^n(i+j)^k\times gcd(i,j)\times \mu(gcd(i,j))^2
\]

解题思路

开始忘记了\(k\)次幂能线性筛后面全推错了,既然可以线性筛\(k\)次幂就把\(gcd(i,j)\)提到前面来。

\[\sum_{d=1}^n\mu(d)^2d\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=d](i+j)^k
\]

这里有一个比较巧妙的思路就是,可以把\(\mu(d)^2d\)提前莫反之后一起套进莫反里。

设有

\[\sum_{d|n}g(d)=\mu(n)^2n\Rightarrow g(n)=\sum_{d|n}\mu(\frac{n}{d})\mu(d)^2d
\]

然后莫反原式就有一个比较简单的式子了

\[\sum_{d=1}^ng(d)d^k\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}(i+j)^k
\]

设\(S(n)=\sum_{i=1}^n\sum_{j=1}^n(i+j)^k\),这个东西是可以线性预处理的。

先预线性筛+前缀和处理出\(s(n)=\sum_{i=1}^ni^k\),就有\(S(n)=\left(\sum_{i=n+1}^{2n}s(i)\right)-\left(\sum_{i=1}^ns(i)\right)\),再用一个前缀和就好了。

然后就有式子

\[\sum_{d=1}^ng(d)d^kS(\lfloor\frac{n}{d}\rfloor)
\]

这个知道怎么筛\(g(d)d^k\)之后好像就可以\(O(T\sqrt n)\)做了?发现\(g\)里面有个\(n\)还是很难搞。

然后可以一顿操作把下取整搞掉,设\(S'(x)=S(x)-S(x-1)\),那么就有

\[\sum_{d=1}^ng(d)d^k\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}S'(i)
\]

然后把\(i\)提出来就有

\[\sum_{i=1}^n\sum_{d|i}g(d)d^kS'(\frac{n}{d})
\]

然后就会发现这是两个函数狄利克雷卷积的前缀和?

\(f(n)=g(n)n^k=n^k\sum_{d|n}\mu(\frac{n}{d})\mu(d)^2d\)是积性函数,所以我们可以用埃氏筛的方法来快速搞这个东西。

首先我们需要知道对于一个质数\(p\),\(f(p^e)\)如何快速计算。

这里是有结论的

  • 若\(e=0\)则\(f(p^0)=f(1)=1\)
  • 若\(e=1\)则\(f(p^1)=p\times (1\times \mu(1)^2\mu(p)+p\times \mu(1)\mu(p)^2)=p(p-1)\)
  • 若\(e=2\)则\(f(p^2)=p^2\times (\mu(p^2)\mu(1)^2+\mu(p)\mu(p)^2p+\mu(1)\mu(p^2)^2p^2)=-p^2\)
  • 若\(e\geq 3\)那么若\(\mu(d)\neq0\)那么一定有\(\mu(\frac{n}{d})=0\),所以\(f(p^e)=0\)

然后就可以开始做了,怎么快速计算狄利克雷卷积?埃氏筛给过我们方法,对于一个积性函数\(f\),我们可以拆成若干个\(f_p\)满足

\[f_p(x)=[p^e=x]f(x)\ \ (p\in Pri)
\]

(\(Pri\)是质数集)

然后有\(f=\prod_{p\in Pri}f_p\)(乘法表示狄利克雷积)

所以把所有的\(f_p\)乘到\(S'\)里去就好了,这个是枚举所有质数的倍数来搞的,时间复杂度\(O(n\log \log n)\)

所以总共的时间复杂度就是\(O(T+n\log \log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define uit unsigned int
using namespace std;
const int N=2e7+10;
int t,n,k,cnt;
uit pri[N],pw[N],s[N];
bool v[N];
uit power(uit x,int b){
uit ans=1;
while(b){
if(b&1)ans=ans*x;
x=x*x;b>>=1;
}
return ans;
}
void init(){
s[1]=1;
for(int i=2;i<=n*2;i++){
if(!v[i])pri[++cnt]=i,s[i]=power(i,k);
for(int j=1;j<=cnt&&i*pri[j]<=n*2;j++){
v[i*pri[j]]=1;s[i*pri[j]]=s[i]*s[pri[j]];
if(i%pri[j]==0)break;
}
}
for(int i=1;i<=n*2;i++)
pw[i]=s[i],s[i]=s[i-1]+s[i];
for(int i=1;i<=n;i++)
s[i]=s[i*2]+s[i*2-1]-s[i]*2;
for(int j=1;j<=cnt&&pri[j]<=n;j++)
for(int x=pri[j],i=n/x;i>=1;i--){
s[i*x]+=s[i]*(x-1)*pw[x];
if(i%x==0)s[i*x]-=s[i/x]*x*pw[x]*pw[x];
}
for(int i=1;i<=n;i++)s[i]+=s[i-1];
return;
}
int main()
{
scanf("%d%d%d",&t,&n,&k);
init();
while(t--){
scanf("%d",&n);
printf("%u\n",s[n]);
}
return 0;
}

P6222-「P6156 简单题」加强版【莫比乌斯反演】的更多相关文章

  1. 洛谷 P6222 - 「P6156 简单题」加强版(莫比乌斯反演)

    原版传送门 & 加强版传送门 题意: \(T\) 组数据,求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n(i+j)^k\mu^2(\gcd(i,j))\g ...

  2. P6222 「简单题」加强版 莫比乌斯反演 线性筛积性函数

    LINK:简单题 以前写过弱化版的 不过那个实现过于垃圾 少预处理了一个东西. 这里写一个实现比较精细了. 最后可推出式子:\(\sum_{T=1}^nsum(\frac{n}{T})\sum_{x| ...

  3. 「bzoj3687: 简单题」

    题目 发现需要一个\(O(n\sum a_i )\)的做法 于是可以直接做一个背包,\(dp[i]\)表示和为\(i\)的子集是否有奇数种 \(bitset\)优化一下就好了 #include< ...

  4. Loj #528. 「LibreOJ β Round #4」求和 (莫比乌斯反演)

    题目链接:https://loj.ac/problem/528 题目:给定两个正整数N,M,你需要计算ΣΣu(gcd(i,j))^2 mod 998244353 ,其中i属于[1,N],j属于[1,M ...

  5. LibreOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖

    6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...

  6. LibreOJ #6002. 「网络流 24 题」最小路径覆盖

    #6002. 「网络流 24 题」最小路径覆盖 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...

  7. Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)

    Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...

  8. Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)

    Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...

  9. [LOJ#6002]「网络流 24 题」最小路径覆盖

    [LOJ#6002]「网络流 24 题」最小路径覆盖 试题描述 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交)的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是  ...

随机推荐

  1. Docker运行sonarqube-(代码质量检测平台)

    sonarqube是什么 SonarQube是用于持续检查代码质量的开源平台. 可用于持续集成,持续部署流程中的代码检测环节. idea和jenkins都提供了插件配合使用. liunx推荐配置环境 ...

  2. Qt foreach关键字用法(无师自通)

    Qt 提供一个关键字 foreach (实际是 <QtGlobal> 里定义的一个宏)用于方便地访问容器里所有数据项. foreach 关键字用于遍历容路中所有的项,使用 foreach ...

  3. SpringBoot以jar包部署需要注意的thymeleaf页面映射问题

    关于themeleaf映射需要注意的: 1.页面映射 所有静态页面映射的时候,mapping后面要以/开头(最好),不以/开头也行 但是return 后面路径不能以/开头:IDE中正常,但是打jar包 ...

  4. servlet中servletContext的五大作用(二)

    1.    获取web的上下文路径 2.    获取全局的参数 3.    作为域对象使用 4.    请求转发 5.    读取web项目的资源文件 package day10.about_serv ...

  5. Linux下MySQL主从复制(GTID)+读写分离(ProxySQL)-实施笔记

    GTID概念: GTID( Global Transaction Identifier)全局事务标识.GTID 是 5.6 版本引入的一个有关于主从复制的重大改进,相对于之前版本基于 Binlog 文 ...

  6. RabitMq过期时间TTL

    第一种:给消息设置过期时间 启动一个插件 @Bean public DirectExchange DirectExchange() { return new DirectExchange(" ...

  7. 快速使用 Docker 上手 Sentry-CLI - 玩转 Source Maps 使用 (create-react-app)

    系列 快速使用 Docker 上手 Sentry-CLI - 创建版本 入门 使用 sentry-cli 上传 source maps 时,您需要设置构建系统以创建版本(release)并上传与该版本 ...

  8. js在不同页面的导航背景不同 (设置网站公共头的导航)

    <script type="text/javascript" src="js/jquery.min.js"></script> < ...

  9. Git工具的使用教程二

    1.3时光穿梭机--版本回退 版本回退分为两步骤进行操作: 步骤: 1.查看版本,确定需要回到的时候点     指令:             git log             git log ...

  10. GUI容器之Panel

    Panel //panel可以看成是一个空间,但不能单独存在 public class MyPanel { public static void main(String[] args) { Frame ...