AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2820

有种方法是枚举质数然后用BZOJ2301来做但是超时了...

具体式子大概张这样:

然后下面一步比较关键,就是将T=p*d带进去

这个时候需要读者自己先手化简一下将ans变成一个与T有关的式子

然后可以再看笔者这个式子

有几个注意的地方,首先T=p*d,所以T的范围是1...n

原式中的n/(p*d)和m/(p*d)就是(n/T)*(m/T)这个好懂,而mu[d]变成mu[T/p]也是很好理解的,注意这个p也是质数

所以这个式子的变形就是这样啦,然后感觉和BZOJ2301有点像了。

[这是2301的图]

唯一区别就是一个是mu[],一个是一大坨东西

于是我们设f(T)=sigma(p|T)mu[T/p]  可以看出这一堆只和T有关。

然后如果能预处理出来f(T)就可以了。

然后有种奥妙重重的做法,枚举每个素数然后去更新这些素数的倍数[然后好像就可以O(n)奥妙重重?因为蒟蒻不会算复杂度,但是这是可以A的]

然后当时宋老师提供了第二种思路,就是分析T的组成。

我们可以假设T=(p1^x1)*(p2^x2)*(p3^x3)...(pk^xk)

然后考虑若xi>=3 那么f(T)=0,因为不管怎么取,就算是除以pi,xi还是>=2的,所以mu[T/p]一定等于0,和也是0

若xi==2 && xj==2也有f(T)=0,理由同上

然后就只有两种情况了

xi==2 && 其他x等于1 ,这时只有取出pi时mu[T/pi]=(-1)^k,其他时候都是0

若 所有xi==1,取出来都等于(-1)^(k-1),答案就是k*(-1)^(k-1)

然后据说你要是线性筛能得到每个数属于哪个范围就可以搞定这道题了。

当时听的时候觉得很兹瓷啊...但是发现我不能实现啊,于是就用唯一分解做了,然后好像最坏是n*log(n)的,然而过了...

所以怎么用线性筛呢...

[那就看聪明的读者您了...]

我的代码:

#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int maxn=; int Prime[maxn],cnt;
int f[maxn],nr[maxn],s[maxn];
bool np[maxn],zn[maxn]; inline int in(){
int x=;char ch=getchar();
while(ch>'' || ch<'') ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return x;
} int get_f(int x){
int k=,find=,rec;
while(x>){
if(rec==nr[x]){if(!find) find=true; else return ;}
rec=nr[x],x/=nr[x],k++;
}
if(find){if(k&) return ; else return -;}
else{if(k&) return k; else return -k;}
} void get_prime(){
for(int i=;i<maxn;i++){
if(!np[i]){Prime[++cnt]=i;nr[i]=i;}
for(int j=;j<=cnt && Prime[j]*i<maxn;j++){
np[Prime[j]*i]=true,nr[Prime[j]*i]=Prime[j];
if(i%Prime[j]==){
zn[Prime[j]*i]=true;break;
}
}
}
for(int i=;i<maxn;i++) f[i]=get_f(i),s[i]=s[i-]+f[i];
} long long calcu(int n,int m){
long long sum=;
if(n>m) swap(n,m);
for(int i=,j=;i<=n;i=j+){
j=min(n/(n/i),m/(m/i));
sum+=(long long)(s[j]-s[i-])*(n/i)*(m/i);
}
return sum;
} int main(){
#ifndef ONLINE_JUDGE
freopen("2820.in","r",stdin);
freopen("2820.out","w",stdout);
#endif get_prime(); int n,m,T=in();
while(T--){
n=in(),m=in();
printf("%lld\n",calcu(n,m));
} return ;
}

BZOJ 2820 YY的GCD的更多相关文章

  1. 【莫比乌斯反演】关于Mobius反演与gcd的一些关系与问题简化(bzoj 2301 Problem b&&bzoj 2820 YY的GCD&&BZOJ 3529 数表)

    首先我们来看一道题  BZOJ 2301 Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd( ...

  2. [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)

    [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...

  3. BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discu ...

  4. 【刷题】BZOJ 2820 YY的GCD

    Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种傻×必然 ...

  5. Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)

    2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...

  6. bzoj 2820 YY的GCD 莫比乌斯反演

    题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性 ...

  7. bzoj 2820 YY的GCD - 莫比乌斯反演 - 线性筛

    Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必 ...

  8. BZOJ 2820 YY的GCD(莫比乌斯函数)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2820 题意:给定n,m.求1<=x<=n, 1<=y<=m且Gc ...

  9. bzoj 2820 YY的GCD(莫比乌斯反演)

    Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻× ...

  10. ●BZOJ 2820 YY的GCD

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2820 题解: 莫比乌斯反演 先看看这个题:HDU 1695 GCD(本题简化版) HDU 1 ...

随机推荐

  1. MongoDB(4):多种方式关闭服务命令

    http://blog.csdn.net/czw698/article/details/8791153 MongoDB 提供几种关闭服务的命令,具体为以下: 一 使用 Crtl+C 关闭  [mong ...

  2. sprintf函数减少字符串拼接错误

    $return_string=""; foreach($cat_list as $value){ $return_string .= sprintf('<dd>< ...

  3. mybatis使用笔记

    关于动态SQL里的条件查询(if test): 1.lombok插件和mybatis插件在有些变量名下会冲突,比如一个变量为rType的字段,lombok插件认为应该是getRType,但是mybat ...

  4. ASP.NET MVC5学习笔记之Controller执行ControllerDescriptor和ActionDescriptor

    一. ControllerDescriptor说明 ControllerDescriptor是一个抽象类,它定义的接口代码如下: public abstract class ControllerDes ...

  5. Java 为什么使用抽象类和接口

    Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现.OOP面向对象的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程, ...

  6. Fix: Compile project encounter undefined reference to“xxx”error

    Need to add all the new cpp files to jni/Andriod.mk folder:

  7. (转)Linux下用mkisofs制作光盘镜像ISO文件

    我们都知道在windows下有winiso可以将光盘制作成光盘镜像ISO文件,在linux下一个命令就搞定了.那就是mkisofs.先看看mkisofs的help. rory@dev:~$ mkiso ...

  8. deep learning学习环境Theano安装(win8+win7)

    官网安装说明Installing Theano:http://deeplearning.net/software/theano/install.html#alternative-anacondace ...

  9. 改用二进制启动Moses translation model提示Can't read ~/working/binarised-model/reordering-table

    解决方案: 换成 /home/用户名/working 貌似就好使了...但是时间还是估计太长,明早挂机一天试试,顺便把manual 的详细部分看了

  10. C高级 服务器内核分析和构建 (一)

    引言 最经看cloud wind 的 skynet服务器设计. 觉得特别精妙. 想来个专题先剖析其通信层服务器内核 的设计原理. 最后再优化.本文是这个小专题的第一部分, 重点会讲解对于不同平台通信基 ...