BZOJ 2820 YY的GCD
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的更多相关文章
- 【莫比乌斯反演】关于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( ...
- [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)有多少对. ...
- BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1624 Solved: 853[Submit][Status][Discu ...
- 【刷题】BZOJ 2820 YY的GCD
Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种傻×必然 ...
- Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)
2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...
- bzoj 2820 YY的GCD 莫比乌斯反演
题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性 ...
- bzoj 2820 YY的GCD - 莫比乌斯反演 - 线性筛
Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必 ...
- BZOJ 2820 YY的GCD(莫比乌斯函数)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2820 题意:给定n,m.求1<=x<=n, 1<=y<=m且Gc ...
- bzoj 2820 YY的GCD(莫比乌斯反演)
Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻× ...
- ●BZOJ 2820 YY的GCD
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2820 题解: 莫比乌斯反演 先看看这个题:HDU 1695 GCD(本题简化版) HDU 1 ...
随机推荐
- PHP常用函数和常见疑难问题解答
PHP常用库函数介绍 一.PHP字符串操作常用函数 1.确定字符串长度 int strlen(string str) 2.比较两个字符串 a. strcmp函数对两个字符串进行二进制安全的比较,并区 ...
- php 提示Warning: mysql_fetch_array() expects
我的高度代码如下 include("conn.php"); if(!empty($_GET['id'])){ $sql="select * from ne ...
- win32 汇编打造 wget 体积3kb
Demo Code .386 .MODEL flat, stdcall OPTION CASEMAP:NONE Include windows.inc include kernel32.inc inc ...
- 类似桌面背景壁纸随手指滑动--第三方开源--BackgroundViewPager
Android BackgroundViewPager在github上的项目主页是:https://github.com/MoshDev/BackgroundViewPager 下载下来即可运行
- Android Socket通信
1.TCP: xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...
- 安装Spark集群(在CentOS上)
环境:CentOS 6.4, Hadoop 1.1.2, JDK 1.7, Spark 0.7.2, Scala 2.9.3 1. 安装 JDK 1.7 yum search openjdk-deve ...
- Win7更改默认打开方式失败
问题描述:选定某个给定文件,然后鼠标右键选择打开方式,在浏览后选到自己期望使用的应用程序,然后单击确定后,却发现没有任何效果.原文件仍然保持原来的打开方式. 问题原因:更好程序或者升级程序时安装路径发 ...
- PHP错误处理
错误的分类: 1.语法错误 2.运行时错误 3.逻辑错误 调试方法:1.注释法 2.输出法 error_reporting(E_ALL & ~E_NOTICE & ~E_WAR ...
- EditText 监听回车事件 避免2次触发
// 侦听回车事件 EidtText txtSN = (EditText) findViewById(R.id.txtSN); txtSN.setOnEditorActionListener(new ...
- SOCKET 地址
地址格式: 函数bind和getsockname使用通用数据类型:struct sockaddr*来指向socket地址. #incude <sys/socket.h> struct so ...