3994: [SDOI2015]约数个数和

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 898  Solved: 619
[Submit][Status][Discuss]

Description

 设d(x)为x的约数个数,给定N、M,求  
 

Input

输入文件包含多组测试数据。

第一行,一个整数T,表示测试数据的组数。
接下来的T行,每行两个整数N、M。
 

Output

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

 

Sample Input

2
7 4
5 6

Sample Output

110
121

HINT

1<=N, M<=50000

1<=T<=50000

Source

Round 1 感谢yts1999上传

分析:

首先$d(x)$是一个积性函数,其次这个东西有一个很神奇的性质:

$d(nm)=\sum _{x\mid n} \sum _{y\mid m} [gcd(x,y)==1]$

证明如下:(懒得写了...公式打起来好麻烦...直接摘抄Sengxian的解释...QwQ)

于是接下来就直接莫比乌斯反演就好了...

$\sum _{x=1}^{n} \sum _{y=1}^{m} \left \lfloor \frac{n}{x} \right \rfloor \left \lfloor \frac{m}{y} \right \rfloor \sum _{d\mid x  d\mid y}\mu (d)$

$=\sum _{d=1}^{x} \mu(d) \sum _{i=1}^{\frac {n}{d}} \left \lfloor \frac{n}{id} \right \rfloor \sum _{j=1}^{\frac {m}{d}} \left \lfloor \frac{m}{jd} \right \rfloor$

现在有一个有用的公式:

$\left \lfloor \frac{n}{xy} \right \rfloor=\left \lfloor \frac{ \left \lfloor \frac{n}{x} \right \rfloor }{y} \right \rfloor$

于是乎,我们定义$f(x)=\sum _{i=1}^{x} \left \lfloor \frac{x}{i} \right \rfloor$,

那么式子就变成酱紫:

$\sum _{d=1}^{n} \mu(d) f(\left \lfloor \frac{n}{d} \right \rfloor) f(\left \lfloor \frac{m}{d} \right \rfloor)$

时间复杂度:$O(N\sqrt{N}+T\sqrt{N})$

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std; const int maxn=50000+5; int n,m,cas,cnt,mu[maxn],pri[maxn],vis[maxn];
long long ans,f[maxn]; inline long long calc(int x){
long long res=0;
for(int i=1,r;i<=x;i=r+1){
r=x/(x/i);
res+=(x/i)*(r-i+1);
}
return res;
} inline void prework(void){
mu[1]=1;
for(int i=2;i<=50000;i++){
if(!vis[i])
vis[i]=1,pri[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*pri[j]<=50000;j++){
vis[i*pri[j]]=1;
if(i%pri[j]==0){
mu[i*pri[j]]=0;break;
}
mu[i*pri[j]]=-mu[i];
}
}
for(int i=1;i<=50000;i++) mu[i]+=mu[i-1],f[i]=calc(i);
} signed main(void){
scanf("%d",&cas);prework();
while(cas--){
scanf("%d%d",&n,&m);
if(n>m) swap(n,m);ans=0;
for(int i=1,r;i<=n;i=r+1){
r=min(n/(n/i),m/(m/i));
ans+=f[n/i]*f[m/i]*(mu[r]-mu[i-1]);
}
printf("%lld\n",ans);
}
return 0;
}

  


By NeighThorn

最新文章

  1. 虚拟机centos6.5 --ssh免密码登录
  2. # 20145334赵文豪 《Java程序设计》第7周学习总结
  3. Java server数据之(4):Redis鸟瞰
  4. ios 基于CAEmitterLayer的雪花,烟花,火焰,爱心等效果demo(转)
  5. Linux计算机进程地址空间与内核装载ELF
  6. General Purpose Hash Function Algorithms
  7. IE查看控件时常
  8. 读书笔记一 Java程序员的基本修养(数组及其内存管理)
  9. 在界面线程不能使用Sleep和WaitForSingleObject之类的函数, 使用 MsgWaitForMultipleObjects
  10. tomcat服务器搭建之ngrok——将内网地址映射到外网
  11. [Hadoop] - 异常Cannot obtain block length for LocatedBlock
  12. Java重载重写与实现方法的规则
  13. Java遍历时删除List、Set、Map中的元素(源码分析)
  14. 12.3、Libgdx的图像之截屏
  15. 移动端无限滚动 TScroll.vue组件
  16. codeforces509B
  17. Python之异常处理和socket套接字连接7
  18. 一个JAVA的WEB服务器事例
  19. php常量PHP_EOL
  20. DI spring.net简单使用

热门文章

  1. centos下搭建svn服务器端/客户端
  2. Python全栈面试题
  3. innodb_index_stats
  4. Linux-获得命令帮助man
  5. C变量之间的转换
  6. python学习总结---网络编程
  7. LeetCode 74——搜索二维矩阵
  8. 学习bash——变量
  9. Linux TCP协议使用的变量
  10. JS让网页上文字出现键盘打字的打字效果