这个题一眼上去应该不是很难,但除了求约数个数有个分解质因数的技巧之外就不会什么了;;

本来想着预处理50000以内的约数个数和之后求个前缀和直接乘、、、可见多么蠢、、搞了2h后弃疗了

结果题解是 要算gcd    (。_。)

还有莫比乌斯反演、、、 …(⊙_⊙;)…

好吧,先借机学一下莫比乌斯反演 、、

其实这道题几乎就是为莫比乌斯而生的(板子题

似乎是函数的反函数、、

所以叫反演、、 (*゜ー゜*)

而这个μ函数就是传说中的的莫比乌斯函数;

要注意是F(n/d)

那这个要怎么用?

那此题来说,首先要证明这个式子:

为什么会和gcd有关?

若i和j互质,那么i*j就是对于d(mn)唯一的约数

如果不互质,那么i和j还能再拆出几个数,作为约数

如  i=4 j=6,n=8,j=12;;

i=2*2   j=2*3

那么   i*j=2*2*2*3

可以写出互质的8 * 3

在循环到i=8,j=3时会被算进去、

而这些拆出的数一定可以对答案贡献1

所以用了bool;;

然后原式相当于求1~n、1~m的和:

根据 sigma交换律 和 可以处理处的某个积性函数μ可以得出莫比乌斯反演,:

就是套公式,  【gcd(a,b)==1】= Σ(d|i,d|j)μ(d)             )

注意μ是根据d能否整除i、d能否整除j   对d的一个函数,返回数值

有人可能要问gcd的判断和    i、j、d的整除关系得到的函数有什么关系?

注意多了一个Σ:也就是说它是先用前面四坨Σ枚举了1~n、 1~m所有可能的约数、、而这最后一个Σ则是枚举约数的约数、、(当然,默认N<M)

若d既整除了i,又整除了j,则i和j不互质,它有公因数d、、、

然后就不会了


我们注意到会有很多重复,重复的个数为  下取整(N/i)  所以可以用乘法优化加法,干掉两个Σ、、

这是反演的一步通用优化

再从d(约数)的角度交换一下位置:

对于每个d都要乘每种可能的i、j搭配,但对于n、m只会出现n/d、m/d次,每次搭配又会产生n/(i*d)、 m/(j*d)个重复

所以都可以乘起来再加

把最右边两项的d写到分子:

我们可以发现有两个不相关的项,可以独立处理:



而且这两个函数计算方式一毛一样,只是定义域值域不一样所以:

就可以化为:

分别处理f函数,再用线筛求出μ函数,就可以做了;;;

码:

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
int mu[50001];
ll f[50001],ans;int i,j,n,tot,su[50001],k,t,m;
bool vis[50001];
void eular()
{mu[1]=1;  for(int i=2;i<=50000;i++){if(!vis[i]){su[++tot]=i;mu[i]=-1;//质数统一为 -1 }for(j=1;i*su[j]<50000&&j<=tot;j++){vis[i*su[j]]=1;if(i%su[j]) {mu[i*su[j]]=-mu[i];//合数如果没有>2的次方的质数就看元素个数(取反,即为(-1)^n) }else {mu[i*su[j]]=0;//合数如果是p^n形式,mu就是0 break;}           }           }for (i=2; i<=50000; i++) mu[i]+=mu[i-1];  //处理前缀和(因为题目有Σ) for (i=1; i<=50000; i++)  //计算f for (j=1; j<=i; j=k+1){  k=i/(i/j);               //可能有点mengbi,k存的是最大的i/j,同 余数之和sum一题 f[i]+=(ll)(k-j+1)*(i/j);   //用乘法加速连加}
}
int main()
{     scanf("%d",&t); eular();
while(t--)
{ scanf("%d%d",&n,&m);ans=0;for (i=1; i<=m && i<=n; i=j+1){//枚举p,计算贡献  j=min(m/(m/i),n/(n/i));  //同余数之和sum的计算方式 ans+=f[m/i]*f[n/i]*(mu[j]-mu[i-1]);//用公式+前缀和统计答案  }if(t)printf("%lld\n",ans);  else printf("%lld",ans);
}
}

莫比乌斯反演就是一个渠道,可以通过这个渠道对看似没有办法化简的式子转化为若干子函数,这样复杂度就会降低、

但式子的转化极其灵活,必须确保每一步正确性,

可以说,能用莫比乌斯反演的题都需要极强的数学敏感度和缜密的推理

当然,暴力性价比高、

附一张反演函数计算法则:

2017.3.19 约数个数和 失败总结相关推荐

  1. 【数学专题】约数个数与欧拉函数

    整理的算法模板合集: ACM模板 目录 一.约数个数 1. AcWing 1291. 轻拍牛头 2. AcWing 1294. 樱花 2.1 AcWing 197. 阶乘分解 3. AcWing 19 ...

  2. 2017.1.19切题总结

    上午切了P1920 这道题是最优骗分+贪心 原题: 有N (1 <= N <= 1,000,000)个 true 或者false的问题. 其中答案是true的问题的个数有K种可能:t_1, ...

  3. 数学:莫比乌斯反演-约数个数和

    BZOJ3994:利用莫比乌斯反演求约数个数和 解答此题需要利用约束个数函数的形式,将其与gcd联系再一起,然后再反演,推导 很麻烦 1 #include<cstdio> 2 #inclu ...

  4. bzoj1225 [HNOI2001] 求正整数 约数个数定理+对数

    一看到约数个数就可以很快想到约数个数定理 然后就是反推,枚举约数 注意需要高精,但搜索过程高精会T,所以利用对数运算对乘和次方降级 如 2^3*3*5  →    log(2^3*3*5) = 3*l ...

  5. 2017.3.13 反素数ant 失败总结

    这个题放弃的非常彻底,因为我怀疑这需要我没学过的数论,不能白白耽误时间(其实是不想推) 第一眼感觉应该是欧拉函数的变种(去非整除数),但绝对不是线筛(太慢),感觉约数的个数这个条件很迷啊,给人最直观的 ...

  6. AcWing 198. [HAOI2007] 反素数 约数个数+dfs

    题 参考 约数个数:每个质因数的次数+1的乘积. 2e9<2x3x5x7x11x13x17x19x23; 2e9<pow(2,31); last其实是最多扫30次. #include< ...

  7. UVA 12465 - The Turanga Leela Problem(求某个数的约数个数)

    题目链接 算是 有公式把.一个数的可以化成,素数相乘的形式,约数个数 = 每个素数的次幂+1的乘积. 知道了这个,还有3个需要注意....我竟然错了9次...哭死了.... 注意 1 的情况特判.   ...

  8. 2017无盘服务器,(2017.11.19)云更新2017正式版2017.6.15.6596无盘xp-win7x32-x64-win10x64公包...

    重要更新: 一.重点功能更新 1.三层更新核心组件升级,降低80%的游戏更新量 : 2.新增显卡PNP功能 (新环境部署更简单): 3.同时支持中英双语言环境 (更高Bigger): 4.优化万兆环境 ...

  9. 图论 + 数论 ---- CF1325E E. Ehab‘s REAL Number Theory Problem (约数个数 + 枚举 + bfs找最小环)[从图结构优化搜索]

    题目链接 题目大意: 给你nnn个数,每个数保证约数个数不超过777个.问你从中选出若 干个数的乘积是完全平方数,最少要选择多少个数?,不存在输出-1. 题目思路: 1.每个数约数不超过7个→\rig ...

最新文章

  1. 静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例。
  2. 5天玩转PyTorch深度学习,从GAN到词嵌入都有实例丨教程资源
  3. 关于Ehcache缓存中timeToLiveSeconds和timeToIdleSeconds
  4. 栈和队列都是限制存取点的线性结构_栈的练习以及解析
  5. 图像处理基本算法-滤波
  6. PS图像菜单下计算命令
  7. struts入门超详细
  8. 2LIS_13_VDITM中开票项目数量计算错误
  9. 06.Qt菜单栏工具栏学习(一)
  10. ELK详解(七)——Kibana部署
  11. 12. 指针、句柄、引用的区别
  12. python使用内置函数方法和桶排序方法实现随机数去重、排序输出
  13. 凸优化系列一:什么是最优化算法
  14. logback-spring.xml文件配置
  15. Qt之Dialog\widget\ mainwindow的区别和布局管理器 分裂器的区别
  16. JQ6500语音模块
  17. 285个地级市的灯光数据(1992-2013年)和雾霾(PM2.5)数据(1998-2016年)
  18. 洛谷 P2184 贪婪大陆
  19. 快递电子面单批量打印接口对接demo-JAVA
  20. Jmeter5.x性能压测工具入门介绍

热门文章

  1. Try Git 译文
  2. Java List相关用法
  3. Ubuntu18.04配置TeXLive2020+TeXstudio
  4. python3 manage.py runserver 0.0.0.0:8000 没反应
  5. Pytorch相关函数详解
  6. 从零开始学keras之电影二分类
  7. python多进程间通信_Python 多进程编程之 进程间的通信(Queue)
  8. 【opencv+python】下载安装教程
  9. A Scala Tutorial for Java programmers之(一)Scala入门:Scala例子,以及如何与Java交互
  10. matlab icol,Matlab 图像处理相关函数命令大全