Problem

bzoj3994 洛谷3327

题意:设 \(d(x)\) 为 \(x\) 的约数个数,给定 \(N,M\),求\(\sum_{i=1}^N\sum_{j=1}^Md(ij)\)

\(1\leq N,M,T\leq 5\times 10^4\)

Solution

第一次推出莫反式 ♪(*)

以下部分中小括号代表\(\gcd\),中括号代表取布尔值

一开始想枚举约数然后看有多少倍数出现过的,发现不好弄,转而想到 \(xy\) 的因数一定是 \(x\) 的因数和 \(y\) 的因数的积,去除冗余后可以得到 \(d(xy)=\sum_{a|x}\sum_{b|y}[(\frac xa,\frac yb)=1]=\sum_{a|x}\sum_{b|y}[(a,b)=1]\)

然后答案为:

\[\sum_{i=1}^N\sum_{j=1}^M\sum_{a|i}\sum_{b|j}[(a,b)=1]
\]

考虑优先枚举\(a,b\)

\[\sum_{a=1}^N\sum_{b=1}^M[(a,b)=1]\lfloor \frac Na\rfloor \lfloor \frac Mb\rfloor
\]

发现里头那个\(\gcd\)可以套路地搞事了:

构造\(f(x)=\sum_{a=1}^N\sum_{b=1}^M[(a,b)=x]\lfloor \frac Na\rfloor \lfloor \frac Mb\rfloor\)

构造\(F(x)=\sum_{a=1}^N\sum_{b=1}^M[x|(a,b)]\lfloor \frac Na\rfloor \lfloor \frac Mb\rfloor\)

可以根据定义式得到\(F(x)=\sum_{x|n}f(n)\),经过莫比乌斯反演,得到\(f(x)=\sum_{x|n}\mu(\frac nx)F(n)\)

答案为\(f(1)=\sum_n\mu(n)F(n)\)

由于\(F(n)\)中可以将\(\gcd\)的限制条件放在前面的\(\sum\)里,所以\(F(n)=\sum_{n|a}\sum_{n|b}\lfloor \frac Na\rfloor \lfloor \frac Mb \rfloor\)

所以答案为

\[f(1)=\sum_d\mu(d)\sum_{d|a}\sum_{d|b}\lfloor \frac Na\rfloor \lfloor \frac Mb \rfloor
\]

发现后面的式子不好求,可以构造\(g(x)=\sum_{i=1}^x\lfloor \frac xi\rfloor\)

则最终的式子为

\[Ans=\sum_d\mu(d)g(\lfloor \frac nd\rfloor)g(\lfloor \frac md \rfloor)
\]

分块解决即可

至于如何求\(g(x)\),可以发现其实\(g(n)=\sum_{i=1}^nd(i)\),利用线性筛完约数函数\(d(i)\)后求个前缀和即可

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; inline void read(int&x){
char c11=getchar();x=0;while(!isdigit(c11))c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();
} const int N=50101;
int pri[N],is[N];
int u[N],g[N],d[N];
int tp;ll sm; int main(){
g[1]=u[1]=1;
for(int i=2;i<N;++i){
if(!is[i])pri[++tp]=i,u[i]=-1,g[i]=2,d[i]=1;
for(int j=1,k;j<=tp and (k=i*pri[j])<N;++j){
is[k]=1;
if(i%pri[j])u[k]-=u[i],g[k]=g[i]*2,d[k]=1;
else {
u[k]=0,d[k]=d[i]+1;
g[k]=g[i]/(d[i]+1)*(d[i]+2);
break;
}
}
g[i]+=g[i-1],u[i]+=u[i-1];
}
int n,m,T;read(T);
while(T--){
read(n),read(m),sm=0ll;
if(n>m)swap(n,m);
for(int i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
sm+=1ll*(u[j]-u[i-1])*g[n/i]*g[m/i];
}printf("%lld\n",sm);
}return 0;
}

题解-SDOI2015 约数个数和的更多相关文章

  1. P3327/bzoj3994 [SDOI2015]约数个数和(莫比乌斯反演)

    P3327 [SDOI2015]约数个数和 神犇题解(转) 无话可补 #include<iostream> #include<cstdio> #include<cstri ...

  2. 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)

    3994: [SDOI2015]约数个数和 Description  设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接 ...

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

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

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

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

  5. 洛谷 [SDOI2015]约数个数和 解题报告

    [SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...

  6. BZOJ 3994: [SDOI2015]约数个数和

    3994: [SDOI2015]约数个数和 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 898  Solved: 619[Submit][Statu ...

  7. 洛谷P3327 - [SDOI2015]约数个数和

    Portal Description 共\(T(T\leq5\times10^4)\)组数据.给出\(n,m(n,m\leq5\times10^4)\),求\[\sum_{i=1}^n\sum_{j= ...

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

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

  9. [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)

    [BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...

随机推荐

  1. 面向对象【day08】:异常处理(六)

    本节内容 1.概述 2.异常梳理 3.异常梳理流程图 4.异常大全 5.自定义异常 一.概述 异常处理是当程序出错了,但是我们又不想让用户看到这个错误,而且我在写程序的时候已经预料到了它可以出现这样的 ...

  2. Kafka权威指南 读书笔记之(一)初识Kafka

    发布与订阅消息系统 数据(消息)的发送者(发布者)不会直接把消息发送给接收者,这是发布与订阅消息系统的一个特点.发布者以某种方式对消息进行分类,接收者(订阅者)订阅它们, 以便接收特定类型的消息.发布 ...

  3. centos 6.5 安装jdk1.8

    1.源码包准备: 首先到官网下载jdk-8u66-linux-x64.tar.gz, http://www.oracle.com/technetwork/java/javase/downloads/j ...

  4. inux进程/线程调度策略与 进程优先级

    目的: 系统性的认识linux的调度策略(SCHED_OTHER.SCHED_FIFO.SCHED_RR): 实时调度?分时调度? 混搭系统(实时任务+分时任务),怎样调度. linux的调度策略 l ...

  5. windows环境安装weblogic服务【转】【补】

    我的环境: windows: win10 professional edition jdk: C:\Program Files\Java\jdk1.6.0_45 weblogic安装目录 (WEBLO ...

  6. java实现《剑指offer》(二)11~20 更新中

    11.二进制中1的个数 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. (1)最优解 public class Solution { public int NumberOf1(int ...

  7. ArcGis Python脚本——批量对影像、要素类定义投影

    这一段是批量定义要素类(FeatureClasses)投影的ArcPy代码: 把要处理的要素类塞进一个文件夹(工作空间,workspace),然后将代码开头的路径换成这个“文件夹”的路径,处理完后再做 ...

  8. node中glob模块

    glob glob允许使用规则,从而获取对应规则匹配的文件 node的glob模块允许你使用 * 等符号,来写一个glob规则,像在shell里一样,获取匹配对应规则文件 安装 npm install ...

  9. Windows Server 2008 R2中无法使用360免费Wifi的解决方案

    为了使主机和虚拟机在同一个无线网络中,而虚拟机的系统是Windows Server 2008 R2 64位的,使用360免费wifi,始终无法开启.在网上查找解决方案,终于找到了原因:Windows ...

  10. Emmet 记录

    Refs 熟悉 css 有优势,emmet 的的缩写语法特别像 css 选择器. =>参考本博笔记 # id > 直接子元素 child . class + Sibling 同级相邻的一个 ...