数论 + 容斥 - HDU 1695 GCD
problem's Link
mean
给定五个数a,b,c,d,k,从1~a中选一个数x,1~b中选一个数y,使得gcd(x,y)=k.
求满足条件的pair(x,y)数.
analyse
由于b,d,k都是1e5数量级的,普通枚举必定超时.
首先可以把b,d都同时除以k,问题就转化成了求1~b/k和1~d/k中的gcd(i,j)=k的对数.
证明如下:
令Ai∈{1,2,3...b},Bi∈{1,2,3...d}.
如果有:GCD(Ai,Bi)=k
则有:GCD(Ai/k,Bi/k)=1
而对于不能够被k整除的数,不可能有GCD(Ai,Bi)=k.
也就是说,除以K所剔除掉的数都是不满足条件的数,对最终答案没有影响.
这样就大大优化了时间复杂度.
然后就是对1e5以内的数进行质因数分解,使用质因数来构造容斥表.
再枚举1~b/k之间的每一个数,利用容斥原理算出1~d/k中有多少个数与之互质即可.
time complexity
O(N*logN)
code
/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-10-08-21.45
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define max(a,b) (a>b?a:b)
using namespace std;
typedef long long(LL);
typedef unsigned long long(ULL);
const double eps(1e-); const int NN=;
bool v[NN];
int p[NN];
void makePrime()
{
int num=-,i,j;
for(i=; i<NN; ++i)
{
if(!v[i]) { p[++num]=i; }
for(j=; j<=num && i*p[j]<NN; ++j)
{
v[i*p[j]]=true;
if(i%p[j]==) { break; }
}
}
} struct node
{
int fac;
bool ti;
node() {}
node(int a,bool b):fac(a),ti(b) {}
};
vector<node> pa[NN]; void pre()
{
int i,j,a,cnt,si;
for(i=; i<=; ++i)
{
a=i;
cnt=;
for(j=; j<=; ++j)
{
if(!(a%p[j]))
{
pa[i].push_back(node(p[j],false));
si=pa[i].size();
for(int k=; k<si-; ++k)
{
pa[i].push_back(node(pa[i][si-].fac*pa[i][k].fac,!pa[i][k].ti));
}
while(!(a%p[j]))
a/=p[j];
}
if(p[j]>a || a<=) break;
}
}
} int main()
{
makePrime();
pre();
ios_base::sync_with_stdio(false);
cin.tie();
int t;
scanf("%d",&t);
for(int Cas=; Cas<=t; ++Cas)
{
int a,b,c,d,k,si;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&k);
if(k==)
{
printf("Case %d: 0\n",Cas);
continue;
}
a=b/k;
b=d/k;
if(a>b) swap(a,b);
LL ans=b;
if(a==) ans=;
for(int i=; i<=a; ++i)
{
si=pa[i].size();
for(int j=; j<si; ++j)
{
if(!(pa[i][j].ti))
{
ans+=((b-i+)-b/pa[i][j].fac+(i-)/pa[i][j].fac);
}
else
{
ans-=((b-i+)-b/pa[i][j].fac+(i-)/pa[i][j].fac);
}
}
}
printf("Case %d: %I64d\n", Cas, ans);
}
return ;
}
数论 + 容斥 - HDU 1695 GCD的更多相关文章
- 数论 + 容斥 - HDU 4059 The Boss on Mars
The Boss on Mars Problem's Link Mean: 给定一个整数n,求1~n中所有与n互质的数的四次方的和.(1<=n<=1e8) analyse: 看似简单,倘若 ...
- POJ 1150 The Last Non-zero Digit 数论+容斥
POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址: id=1150" rel="nofollow" style="colo ...
- HDU 1695 GCD 容斥
GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 Description Given 5 integers: a, b, c, d, k ...
- hdu 1695 GCD 欧拉函数 + 容斥
http://acm.hdu.edu.cn/showproblem.php?pid=1695 要求[L1, R1]和[L2, R2]中GCD是K的个数.那么只需要求[L1, R1 / K] 和 [L ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 1695 GCD 容斥+欧拉函数
题目链接 求 $ x\in[1, a] , y \in [1, b] $ 内 \(gcd(x, y) = k\)的(x, y)的对数. 问题等价于$ x\in[1, a/k] , y \in [1, ...
- HDU 1695 GCD(容斥定理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- HDU - 2204 Eddy's爱好 (数论+容斥)
题意:求\(1 - N(1\le N \le 1e18)\)中,能表示成\(M^k(M>0,k>1)\)的数的个数 分析:正整数p可以表示成\(p = m^k = m^{r*k'}\)的形 ...
- ●HDU 1695 GCD
题链: http://acm.hdu.edu.cn/showproblem.php?pid=1695 题解: 容斥. 莫比乌斯反演,入门题. 问题化简:求满足x∈(1~n)和y∈(1~m),且gcd( ...
随机推荐
- (剑指Offer)面试题54:表示数值的字符串
题目: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.14 ...
- setsockopt之 TCP_KEEPIDLE/TCP_KEEPINTVL/TCP_KEEPCNT
setsockopt之 TCP_KEEPIDLE/TCP_KEEPINTVL/TCP_KEEPCNT /*检测网线非法断开*/ setsockopt(iSockFd, SOL_SOCKET, S ...
- JUnit 3.8 通过反射测试私有方法
测试私有(private)的方法有两种: 1)把目标类的私有方法(修饰符:private)修改为(public),不推荐,因为修改了源程序不佳 2)通过反射 (推荐) 代码演示: 目标程序 Priva ...
- oracle 存储过程 变量的声明和赋值的3种方式
oracle 存储过程 变量的声明和赋值的3种方式 CreationTime--2018年8月31日16点00分 Author:Marydon 1.声明变量的3种方式 按照数据类型的声明方式进行区 ...
- Java中被你忽视的四种引用(转)
转载自:http://blog.csdn.net/u010425776/article/details/50760053 Java的数据类型分为两类:基本数据类型.引用数据类型. 基本数据类型的值存储 ...
- 【mysql】主键、普通索引、唯一索引和全文索引的比较
YSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记 ...
- Linux命令-网络命令:write
write只能给登录用户发送消息,所以先登录两个用户root和wangyunpeng root登录: wangyunpeng登录: who 查看登录用户 root发送信息给wangyunpeng: w ...
- .Net Excel 导出图表Demo(柱状图,多标签页) .net工具类 分享一个简单的随机分红包的实现方式
.Net Excel 导出图表Demo(柱状图,多标签页) 1 使用插件名称Epplus,多个Sheet页数据应用,Demo为柱状图(Epplus支持多种图表) 2 Epplus 的安装和引用 新建一 ...
- Ant打包Android代码生成apk文件
可參考下面,实现一套代码不同渠道的打包 http://blog.csdn.net/liuhe688/article/details/6679879 http://cnn237111.blog.51ct ...
- 使用HTML5的Notification API制作web通知的教程(转)
var notification=new Notification(‘Notification Title',{ body:'Your Message' }); 上面的代码构造了一个简陋的通知栏.构造 ...