正题

题目链接:http://www.ybtoj.com.cn/contest/122/problem/3


题目大意

\(S(i)\)表示\(i\)的约数个数,\(Q\)次询问给出\(n,m\)求

\[\sum_{a=1}^n\sum_{b=1}^mS(a^2)\times S(b^2)\times S(a\times b)
\]

\(1\leq Q\leq 10^4,1\leq n,m\leq 2\times 10^5\)


解题思路

前面的推式子挺套路的

首先我们要搞定\(S(n^2)\)这个东西,一个经典的结论就是\(S(n\times m)=\sum_{i|n}\sum_{j|m}[gcd(i,j)=1]\)。莫反一下就有

\[S(a\times b)=\sum_{d|(a\times b)}\mu(d)\sum_{i\times d|a}\sum_{j\times d|b}1
\]

所以就有

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

用线性筛筛出前面的\(S\),然后\(O(n\log n)\)求出\(h(n)=S(n^2)\)

然后化一下式子

\[\sum_{a=1}^n\sum_{b=1}^mh(a)\times h(b)\sum_{i|a}\sum_{j|b}[gcd(i,j)=1]
\]
\[\sum_{d=1}\mu(d)(\sum_{d|i}\sum_{i|a}h(a))(\sum_{d|j}\sum_{j|b}h(b))
\]
\[\sum_{d=1}\mu(d)(\sum_{d|a}S(\frac{a}{d})h(a))(\sum_{d|b}S(\frac{b}{d})h(b))
\]

然后就好像没得化简了,先处理出\(F(d,n)=\sum_{i=1}^nh(i\times d)S(i)\)

发现\(d\)很大的时候后面那个东西的取值就很小,但是\(d\)很多,需要快速处理。

设定一个分界值\(T\),每次小于\(T\)的部分我们就暴力用\(F\)数组计算,大于\(T\)的部分我们预处理出一个

\[G(d,i,j)=\sum_{x=T+1}^dF(i)F(j)\mu(d)
\]

然后整除分块计算。

这里的\(k\)取\(N^{\frac{2}{3}}\)会平均一些,时间复杂度\(O(n^{\frac{4}{3}}+Qn^{\frac{2}{3}})\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
using namespace std;
const ll N=2e5+10,P=1<<30;
ll q,n,m,cnt,pri[N],mu[N],S[N],sg[N],g[N],o[N];
vector<int>f[N],d[N];
bool v[N];
void prime(){
mu[1]=sg[1]=1;
for(ll i=2;i<N;i++){
if(!v[i])pri[++cnt]=i,mu[i]=-1,g[i]=2,sg[i]=2;
for(ll j=1;j<=cnt&&i*pri[j]<N;j++){
v[i*pri[j]]=1;
if(i%pri[j]==0){
g[i*pri[j]]=g[i]+1;
sg[i*pri[j]]=sg[i]/g[i]*g[i*pri[j]];
break;
}
mu[i*pri[j]]=-mu[i];g[i*pri[j]]=2;
sg[i*pri[j]]=sg[i]*sg[pri[j]];
}
}
for(ll i=1;i<N;i++)
for(ll j=i;j<N;j+=i)
(S[j]+=sg[j/i]*sg[j/i]*mu[i]%P)%=P;
return;
}
signed main()
{
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
prime();
scanf("%lld",&q);ll lim=2e5;
ll T=(ll)pow(lim,2.0/3.0)+1;
f[0].resize(lim+1);
for(ll i=1;i<=lim;i++){
f[i].push_back(0);
for(ll j=1;j<=lim/i;j++){
ll tmp=f[i][j-1];
f[i].push_back((tmp+S[i*j]*sg[j])%P);
}
}
d[T].resize((lim/T)*(lim/T)+1);
for(ll i=T+1;i<=lim;i++){
ll p=lim/i;
d[i].resize(p*p+1);
for(ll j=1,sum=0;j<=lim/i;j++)
for(ll k=j;k<=lim/i;k++)
d[i][(j-1)*p+k]=(d[i-1][(j-1)*o[i-1]+k]+f[i][j]*f[i][k]*mu[i])%P;
o[i]=p;
}
while(q--){
scanf("%lld%lld",&n,&m);
if(n>m)swap(n,m);ll ans=0;
for(ll i=1;i<=min(T,n);i++)
(ans+=1ll*f[i][n/i]*f[i][m/i]*mu[i]%P)%=P;
for(ll l=T+1,r;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
(ans+=d[r][(n/l-1)*o[r]+m/l]-d[l-1][(n/l-1)*o[l-1]+m/l])%=P;
}
printf("%lld\n",(ans+P)%P);
}
return 0;
}

YbtOJ#943-平方约数【莫比乌斯反演,平衡规划】的更多相关文章

  1. P4240-毒瘤之神的考验【莫比乌斯反演,平衡规划】

    正题 题目链接:https://www.luogu.com.cn/problem/P4240 题目大意 \(Q\)组数据给出\(n,m\)求 \[\sum_{i=1}^n\sum_{j=1}^m\va ...

  2. 【BZOJ3994】约数个数和(莫比乌斯反演)

    [BZOJ3994]约数个数和(莫比乌斯反演) 题面 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] 多组数据\((<=50000组)\) \(n,m<=50000\ ...

  3. BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演

    BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演 Description  设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表 ...

  4. 【BZOJ3994】[SDOI2015] 约数个数和(莫比乌斯反演)

    点此看题面 大致题意: 设\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^N\sum_{j=1}^Md(i·j)\). 莫比乌斯反演 这是一道莫比乌斯反演题. 一个重要的性质 首先 ...

  5. 洛谷P3327 [SDOI2015]约数个数和 【莫比乌斯反演】

    题目 设d(x)为x的约数个数,给定N.M,求\(\sum_{i = 1}^{N} \sum_{j = 1}^{M} d(ij)\) 输入格式 输入文件包含多组测试数据.第一行,一个整数T,表示测试数 ...

  6. P3327 [SDOI2015]约数个数和 莫比乌斯反演

    P3327 [SDOI2015]约数个数和 莫比乌斯反演 链接 luogu 思路 第一个式子我也不会,luogu有个证明,自己感悟吧. \[d(ij)=\sum\limits_{x|i}\sum\li ...

  7. [SDOI2015][bzoj 3994][Luogu P3327] 约数个数和 (莫比乌斯反演)

    题目描述 设d(x)d(x)d(x)为xxx的约数个数,给定NNN.MMM,求 ∑i=1N∑j=1Md(ij)\sum^{N}_{i=1}\sum^{M}_{j=1} d(ij)i=1∑N​j=1∑M ...

  8. 51nod 1584 加权约数和 约数和函数小trick 莫比乌斯反演

    LINK:加权约数和 我曾经一度认为莫比乌斯反演都是板子题. 做过这道题我认输了 不是什么东西都是板子. 一个trick 设\(s(x)\)为x的约数和函数. 有 \(s(i\cdot j)=\sum ...

  9. BZOJ 3994: [SDOI2015]约数个数和3994: [SDOI2015]约数个数和 莫比乌斯反演

    https://www.lydsy.com/JudgeOnline/problem.php?id=3994 https://blog.csdn.net/qq_36808030/article/deta ...

随机推荐

  1. springboot 和spring cloud 博客分享

    spring boot 知识点总结 天狼星 https://www.cnblogs.com/wjqhuaxia/p/9820902.html spring cloud 知识点总结 姿势帝 https: ...

  2. 【springboot】全局异常处理

    转自: https://blog.csdn.net/cp026la/article/details/86495196 前言: 开发中异常的处理必不可少,常用的就是 throw 和 try catch, ...

  3. Spring整合Quartz轻松完成定时任务

    一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...

  4. jQuery中的表单过滤选择器(四、七)::input、:text、:password、:radio、:checkbox、:file等

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  5. Servlet的特点及运行过程

  6. 算法入门 - 链表的实现及应用(Java版本)

    之前我们学习了动态数组,虽然比原始数组的功能强大了不少,但还不是完全纯动态的(基于静态数组实现的).这回要讲的链表则是正儿八经的动态结构,是一种非常灵活的数据结构. 链表的基本结构 链表由一系列单一的 ...

  7. docker学习之network:初识网络配置

    起因 我的开发环境需要一个python代码运行环境.reids服务和mysql服务. 由于以前,我的开发环境是mac,而CI和线上运行环境是centos,偶尔会出项本地单元测试跑不过,而CI可以过.这 ...

  8. OVN架构

    原文地址 OVN架构 1.简介 OVN,即Open Virtual Network,是一个支持虚拟网络抽象的系统. OVN补充了OVS的现有功能,增加了对虚拟网络抽象的原生(native)支持,比如虚 ...

  9. Redis实现主从复制以及sentinel的配置

    redis 是一个高性能的 key-value 数据库. redis 的出现,很大程度补偿了 memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很 好的补充作用.它 ...

  10. 小白也能看懂的dubbo3应用级服务发现详解

    搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 本文已收录 https://github.com/lkxiaolou/lkxiao ...