hdu 1695 GCD 莫比乌斯反演入门
GCD
题意:输入5个数a,b,c,d,k;(a = c = 1, 0 < b,d,k <= 100000);问有多少对a <= p <= b, c <= q <= d使得gcd(p,q) = k;
注:对于(p,q)和(q,p)只算一次;
思路:由于遍历朴素求两个数的gcd的时间复杂度为O(n^2*log(n)),朴素算法遍历搜索在判断累加,所以效率很低;
莫比乌斯反演:利用整与分之间的可逆来由整体利用容斥原理得到分量的值;这就是用容易求解的F[n]通过莫比乌斯公式(函数mu[])得到分量f[n]的值;
如本题中:F[n]表示公倍数是n的倍数的个数,f[n]表示公倍数为n的个数;即F[d] = Σf[n] ,(d|n);
同样每个F[d](d|n)中都含有f[n]的分量,所以可以使用容斥原理来求解;对应下面两个公式;
公式1:
公式2:
细节:这道题b,d并不相等,由于只是组合不是排列,这需要两次求之后去重;开始直接线性筛法把mu[]预处理出来即可;
坑:以前线性筛素数,一直用的p[j] < MAXN/i没事,今天各种WA...打击真大。。之后改成p[j]*i < MAXN也没做1LL*处理都没事。。
时间复杂度为:O(n)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
#include<map>
#include<queue>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
typedef pair<int,int> PII;
#define A first
#define B second
#define MK make_pair
typedef __int64 ll;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
const int MAXN = ;
int mu[MAXN],vis[MAXN],p[MAXN];
void mobius()
{
mu[] = ;//定义
rep0(i,,MAXN){
if(vis[i] == ){
mu[i] = -;
p[++p[]] = i;
}
for(int j = ;j <= p[] && 1LL*p[j]*i < MAXN;j++){ // p[j] < MAXN/i WA了
vis[i*p[j]] = ;
if(i%p[j]) mu[i*p[j]] = -mu[i];
else{
mu[i*p[j]] = ;
break;
}
}
}
}
int main()
{
int T,kase = ,a,b,c,d,k;
mobius();
read1(T);
while(T--){
ll ans = ,tmp = ;
read2(a,b);read3(c,d,k);
if(k == ){
printf("Case %d: %I64d\n",kase++,ans);
continue;
}
b /= k,d /= k;//**这样更简便
if(b > d) swap(b,d);
rep1(i,,b) ans += 1LL*mu[i]*(b/i)*(d/i);
rep1(i,,b) tmp += 1LL*mu[i]*(b/i)*(b/i);
printf("Case %d: %I64d\n",kase++,ans - tmp/);
}
return ;
}
hdu 1695 GCD 莫比乌斯反演入门的更多相关文章
- HDU 1695 GCD 莫比乌斯反演
分析:简单的莫比乌斯反演 f[i]为k=i时的答案数 然后就很简单了 #include<iostream> #include<algorithm> #include<se ...
- hdu 1695 GCD 莫比乌斯
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- ●HDU 1695 GCD
题链: http://acm.hdu.edu.cn/showproblem.php?pid=1695 题解: 容斥. 莫比乌斯反演,入门题. 问题化简:求满足x∈(1~n)和y∈(1~m),且gcd( ...
- BZOJ 2820 luogu 2257 yy的gcd (莫比乌斯反演)
题目大意:求$gcd(i,j)==k,i\in[1,n],j\in[1,m] ,k\in prime,n,m<=10^{7}$的有序数对个数,不超过10^{4}次询问 莫比乌斯反演入门题 为方便 ...
- $BZOJ$2818 $gcd$ 莫比乌斯反演/欧拉函数
正解:莫比乌斯反演/欧拉函数 解题报告: 传送门$QwQ$ 一步非常显然的变形,原式=$\sum_{d=1,d\in prim}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[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)有多少对. ...
- GCD HDU - 1695 莫比乌斯反演入门
题目链接:https://cn.vjudge.net/problem/HDU-1695#author=541607120101 感觉讲的很好的一个博客:https://www.cnblogs.com/ ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1695 GCD (莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- Migration from Zend Framework v2 to v3
Migration from Zend Framework v2 to v3 Zend Framework v2 to v3 has been intended as an incremental u ...
- window.external.notify() 与 UglifyJS 压缩优化冲突
近期研究了一下 UglifyJs 对 JS 代码的压缩,发现 UglifyJS 压缩后,无法调用 window.external.notify() 方法,JS 代码如下: function MyNot ...
- AT-FragmentPagerAdapter
关于FragmentPagerAdapter的粗略翻译 英文版api地址:FragmentPagerAdapter(自备梯子) FragmentPagerAdapter 类概述(Class Ov ...
- 开源Web安全测试工具调研
开源Web安全测试工具调研 http://blog.csdn.net/testing_is_believing/article/details/22302087
- typedef的使用3——使用经过typedef定义的函数构成的函数数组
#include <stdio.h> #include <string.h>//不加还能跑,加上反而跑不了了...笑哭 #pragma warning(disable:4996 ...
- JavaScript中的作用域与函数和变量声明的提升
var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); ...
- Linux下root密码忘记的解决办法
{启动方式} ========================================================================== 一. lilo 1. 在出现 lil ...
- 简单测试IIS下的UrlRewrite技术
UrlRewrite即地址变换.它可以实现静态功能方便搜索引擎收录,比如http://***/news.asp?corangeid=11它可以变为htt://***/news-11.html.这样还实 ...
- Android——四种AterDialog
本经验将分别介绍Android里面的四种AlertDialog分别是:显示带中立,取消,确定的提示框. 获取带列表的对话框按钮.获取带单选列表的对话框按.获取显示带多选项的对话框.此经验介绍获取显示带 ...
- SQLSERVER2000使用TSQL将数据导入ACCESS并压缩生成rar
查询分析器操作ACCESS数据表数据 (1)查询:select top 10 * from OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'C:\Documents an ...