[SDOI2015]约数个数和

题目描述

设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limitsN_{i=1}\sum\limitsM_{j=1}d(ij)$

输入输出格式

输入格式:

输入文件包含多组测试数据。第一行,一个整数\(T\),表示测试数据的组数。接下来的\(T\)行,每行两个整数\(N,M\)。

输出格式:

\(T\)行,每行一个整数,表示你所求的答案。

说明

\(1 \le N, M \le 50000\)

\(1 \le T \le 50000\)


Solution

引理\(1\):

\[\sum_{d|gcd(a,b)} \mu(d)=[gcd(a,b)=1]
\]

引理\(2\):

\[d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]
\]

可以通过\(d\)唯一分解后的计算式感性理解一下

剩下的暴力推个式子

\[\sum_{i=1}^a\sum_{j=1}^bd(ij)
\]

\[=\sum_{i=1}^a\sum_{j=1}^b\sum_{x|i}\sum_{y|j}\sum_{d|gcd(x,y)}\mu(d)
\]

暴力更换不太好枚举的一些东西(比如谁整除谁)

\[=\sum_{i=1}^a\sum_{j=1}^b\sum_{x|i}\sum_{y|j}\sum_{d=1}^{min(a,b)}\mu(d)[d|gcd(x,y)]
\]

\[=\sum_{d=1}^{min(a,b)}\mu(d)\sum_{i=1}^a\sum_{j=1}^b\sum_{x|i}\sum_{y|j}[d|gcd(a,b)]
\]

调整求和顺序

\[=\sum_{d=1}^{min(a,b)}\mu(d)\sum_{x=1}^a\sum_{y=1}^b[d|gcd(a,b)]\sum_{x|i}^a\sum_{y|j}^b 1
\]

\[=\sum_{d=1}^{min(a,b)}\mu(d)\sum_{x=1}^a\sum_{y=1}^b[d|gcd(a,b)]\lfloor\frac{a}{x}\rfloor\lfloor\frac{b}{y}\rfloor
\]

某一项太不好弄了,通过更改枚举项拿掉

\[=\sum_{d=1}^{min(a,b)}\mu(d)\sum_{x=1}^{\lfloor\frac{a}{d}\rfloor}\sum_{y=1}^{\lfloor\frac{b}{d}\rfloor}\lfloor\frac{a}{dx}\rfloor\lfloor\frac{b}{dy}\rfloor
\]

发现求和项也带有下取整,预处理前缀和以后直接整除分块就可以了。


Code:

#include <cstdio>
#define ll long long
const int N=5e4;
int pri[N+10],mu[N+10],ispri[N+10],f[N+10],cnt,T,a,b;
void init()
{
mu[1]=1;
for(int i=2;i<=N;i++)
{
if(!ispri[i])
{
pri[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&pri[j]*i<=N;j++)
{
ispri[i*pri[j]]=1;
if(i%pri[j]==0) break;
else mu[i*pri[j]]=-mu[i];
}
}
for(int i=1;i<=N;i++)
{
mu[i]+=mu[i-1];
for(int l=1,r;l<=i;l=r+1)
{
r=i/(i/l);
f[i]+=i/l*(r-l+1);
}
}
}
int min(int x,int y){return x<y?x:y;}
int main()
{
init();
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&a,&b);
ll ans=0;
for(int l=1,r;l<=min(a,b);l=r+1)
{
r=min(a/(a/l),b/(b/l));
ans+=1ll*(mu[r]-mu[l-1])*f[a/l]*f[b/l];
}
printf("%lld\n",ans);
}
return 0;
}

2018.10.20

洛谷 [SDOI2015]约数个数和 解题报告的更多相关文章

  1. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  2. 洛谷 P4714 「数学」约数个数和 解题报告

    P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...

  3. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  4. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  5. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  6. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  7. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  8. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  9. 洛谷P3327 约数个数和 结论+莫比乌斯反演

    原题 就是让你求\(\sum\limits_{i=1}\sum\limits_{j=1}d(ij)\)(其中\(d(x)\)表示\(x\)的因数个数) 首先有引理(然而并没有证明): \(d(ij)= ...

随机推荐

  1. JDK8 新特性

    JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 ...

  2. thinkphp 3.2中依靠关联模型来关联三个表

    这里说的是用thinkphp3.2关联模型关联三个表 根据用户表查询出三个表的数据,需要两个model来配合,第一个model是根据user表来查询到班级的信息,然后第二个model是根绝banji中 ...

  3. python七类之列表元组

    列表 一.关键字:  list  lst = [ , , , , , , ,] lst = [1,2,3,4] 二.方法: 1.增加:​ . append( ) #追加​​​,添加元素进列表最后 ls ...

  4. C语言实现计算二进制数字1的个数

    #include<stdio.h> #include<stdlib.h> int print_one_bits01(unsigned int value){ //0000 11 ...

  5. Python3爬虫(十) 数据存储之非关系型数据库MongoDB

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.非关系型数据库NoSQL全程是Not Only SQL,非关系型数据库.NoSQL是基于键值对的,不需要经过S ...

  6. java第二章 变量和运算符

      Java 基础应用编程——  变量和运算符 1.Java程序结构          数据类型:确定要存储在内存中的数据的类型.          变量:是存储数据的基本单元 2.变量的概念   变 ...

  7. 三张照片解决--win10系统的edge浏览器设置为浏览器IE8,IE7,IE9---完美解决 费元星

      主要思想:         第二种方法:     参考文档: 1.可以在系统盘的C:\Program Files\Internet Explorer中找到iexplore.exe,然后将其发送到桌 ...

  8. Redis进阶:数据持久化,安全,在PHP中使用

    一.redis数据持久化 由于redis是一个内存数据库,如果系统遇到致命问题需要关机或重启,内存中的数据就会丢失,这是生产环境所不能允许的.所以redis提供了数据持久化的能力. redis提供了两 ...

  9. iOS-合成图片(长图)

    合成图片 直接合成图片还是比较简单的,现在的难点是要把,通过文本输入的一些基本数据也合成到一张图片中,如果有多长图片就合成长图. 现在的实现方法是,把所有的文本消息格式化,然后绘制到一个UILable ...

  10. NetBeans集成SVN代码管理实例

    最近给银行做一个小工具,要求用Java做一个C端带界面的小工具,想来想去用NetBeans最合适,因为Eclipse,MyEclipse,IDEA这些做界面得要额外的UI插件,比较麻烦. 我跟同事两个 ...