题目大意

求出\(\sum_{i=1}^{n} \sum_{i=1}^{m} gcd(i,j)\times 2 -1\)。

题解

解法还是非常的巧妙的,我们考虑容斥原理。我们定义\(f[i]\)表示\(gcd(x,y)\)的数对的个数,但是我们可以发现这样的状态并不好直接转移。那么我们就从\(f[i]\)的倍数入手(也就是\(gcd(x,y)\)的倍数入手,这样比较好理解),先定义\(g[i]\)为在数对\((x,y)\)中\(gcd(x,y)\)是\(i\)的倍数的个数。这种思想比较像线性筛素数。

对于一开始的\(g[i]\)就是\(\frac{n\times m}{i^2}\)。关于这个玩意的证明我还是不怎么会,但是好像听其他大佬说:你太弱了,这是显而易见的。(emm~~我果然是太弱了)

那么我们就当这个东西是显而易见的好了,如果有证明我会回来补坑的。(应该也有很多小伙伴也不知道这个东西怎么证明)(可能是我太菜了,不要吐槽我QAQ)。


证明(update by 2019/3/3 19.33)

是我脑子出问题了,其实画一个图就出来的事情,还搞得怎么复杂。证明简单,如下:
已知:\(x\in [1,n]\)且\(y\in [1,m]\)。
求证:\(gcd(x,y)\)的倍数(包括\(1\)倍)的个数有\(\frac{n\times m}{gcd(x,y)^2}\)。
证明:我们假设\(g=gcd(x,y)\),那么可以得到最小的数对就是\((1,g)\)和\((g,1)\),那么非常显然数对\((g,g)\)的\(gcd\)也是\(g\)的倍数,那么也可以推出在\([1,n]\)和\([1,m]\)的范围内,在横排上有\(n/g\)和\(m/g\),根据乘法原理,所有的点对的个数就是\(n*m/(g^2)\)。


得到这些倍数之后,因为我们是算倍数,在\(g[i]\)中包含了\(g[i\times 2]+\cdots+g[i\times k] \ (i\times k<=min(n,m))\),那么容斥原理把这些重复的部分减去就可以了,也就是\(f[i]=f[i]-g[i\times2]-g[i\times3]-\cdots-g[i\times k] \ (i\times k<=min(n,m))\)

小小的细节:因为我们是要算出倍数,那么我们倍数必须要先算出来,那么在枚举是我们要从后向前枚举,是不是非常好理解。

ac代码

# include <cstdio>
# include <cstring>
# include <algorithm>
# include <ctype.h>
# include <iostream>
# include <cmath>
# include <map>
# include <vector>
# include <queue>
# define LL long long
# define ms(a,b) memset(a,b,sizeof(a))
# define ri (register int)
# define inf (0x7f7f7f7f)
# define pb push_back
# define fi first
# define se second
# define pii pair<int,int>
# define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
inline int gi(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
# define N 100005
int n,m;
LL ans,f[N];
int main(){
    n=gi(),m=gi();
    for (int i=n;i>=1;i--){
        f[i]=(LL)(n/i)*(m/i);
        for (int j=2*i;j<=min(n,m);j+=i) f[i]-=f[j];//容斥原理,减去重复的部分
        ans+=(LL)(i*2-1)*f[i];
    }
    printf("%lld\n",ans);
    return 0;
}

最新文章

  1. Android高手速成--第三部分 优秀项目
  2. ZabbixCPU温度监视-Centos
  3. Java单例模式实现的几种方式
  4. Jquery控制滚动显示欢迎字幕v2
  5. DECO 一个REACT NAtive 开发IDE工具
  6. Delphi内嵌汇编语言BASM精要(转帖)
  7. 一路踩过的坑 php
  8. java--面向抽象编程
  9. IJKMediaFramework第三方库的使用
  10. leetcode@ [307] Range Sum Query - Mutable / 线段树模板
  11. QT 常用设置
  12. Qt遍历图片文件
  13. Tomcat内存溢出
  14. NetCore1.1+Linux部署初体验
  15. zend studio里面这块注释是用什么快捷键按出来的?
  16. PhpStorm使用之 —— Xdebug断点调试
  17. Nodejs.调用Linux命令
  18. 【原】无脑操作:IDEA热部署设置
  19. 第三周 IP通信基础回顾
  20. Android 官方独立 adb / fastboot 工具包

热门文章

  1. 【转】Raft 为什么是更易理解的分布式一致性算法
  2. select 下拉选中
  3. 一次永久解决cmd窗口汉字显示乱码
  4. 51Nod 1677 treecnt
  5. hadoop_spark伪分布式实验环境搭建和运行实例详细教程
  6. 分布式系统session一致性的问题
  7. PowerBI开发 第十五篇:DAX 表达式(时间+过滤+关系)
  8. React.js 开发参见问题 Q&amp;A
  9. Puppet常识梳理
  10. SQLServer 中发布与订阅