GCD

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 5454    Accepted Submission(s): 1957

Problem Description
Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're only required to output the total number of different number
pairs.

Please notice that, (x=5, y=7) and (x=7, y=5) are considered to be the same.



Yoiu can assume that a = c = 1 in all test cases.
 
Input
The input consists of several test cases. The first line of the input is the number of the cases. There are no more than 3,000 cases.

Each case contains five integers: a, b, c, d, k, 0 < a <= b <= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000, as described above.
 
Output
For each test case, print the number of choices. Use the format in the example.
 
Sample Input
2
1 3 1 5 1
1 11014 1 14409 9
 
Sample Output
Case 1: 9
Case 2: 736427
Hint
For the first sample input, all the 9 pairs of numbers are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (3, 5).
 

题意: 求(1,a) 和(1,b) 两个区间 公约数为k的对数的个数

思路:将a,b分别处以k,就能够转化为(1,a/k)和(1,b/k)两个区间两两互质的个数,能够先用欧拉函数求出(1,a)两两互质的个数,(a+1。b) 能够分解质因数。由于质因数的个数最多为7能够用容斥原理计算。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
using namespace std; const int maxn = 10000+10;
const int maxxn = 100000+10;
typedef long long ll;
int a,b,gcd;
ll ans;
bool isPrime[maxn];
ll minDiv[maxxn],phi[maxxn],sum[maxxn];
vector<int> prime,cnt[maxxn],digit[maxxn]; void getPrime(){
prime.clear();
memset(isPrime,1,sizeof isPrime);
for(int i = 2;i < maxn; i++){
if(isPrime[i]){
prime.push_back(i);
for(int j = i*i; j < maxn; j+=i){
isPrime[j] = 0;
}
}
}
} void getPhi(){
for(ll i = 1; i < maxxn; i++){
minDiv[i] = i;
}
for(ll i = 2; i*i < maxxn; i++){
if(minDiv[i]==i){
for(int j = i*i; j < maxxn; j += i){
minDiv[j] = i;
}
}
}
phi[1] = 1;
sum[1] = 1;
for(ll i = 2; i < maxxn; i++){
phi[i] = phi[i/minDiv[i]];
if((i/minDiv[i])%minDiv[i]==0){
phi[i] *= minDiv[i];
}else{
phi[i] *= minDiv[i]-1;
}
sum[i] = phi[i]+sum[i-1];
}
} void getDigit(){
for(ll i = 1; i < maxxn; i++){
int x = i;
for(int j = 0; j < prime.size()&&x >= prime[j]; j++){
if(x%prime[j]==0){
digit[i].push_back(prime[j]);
int t = 0;
while(x%prime[j]==0){
t++;
x /= prime[j];
}
cnt[i].push_back(t);
}
}
if(x!=1){
digit[i].push_back(x);
cnt[i].push_back(1);
}
}
} int main(){
getPrime();
getPhi();
getDigit();
int ncase,T=1;
cin >> ncase;
while(ncase--){
int t1,t2;
scanf("%d%d%d%d%d",&t1,&a,&t2,&b,&gcd);
if(gcd==0){
printf("Case %d: 0\n",T++,ans);
continue;
}else{
if(a > b) swap(a,b);
a /= gcd,b /= gcd;
ans = sum[a];
for(ll i = a+1; i <= b; i++){
int d = digit[i].size();
int t = 0;
vector<int> di;
for(int k = 1; k < (1<<d); k++){
di.clear();
for(int f = 0; f < d; f++){
if(k&(1<<f)){
di.push_back(digit[i][f]);
}
}
int ji = 1;
for(int f = 0; f < di.size(); f++){
ji *= di[f];
}
if(di.size()%2==0){
t -= a/ji;
}else{
t += a/ji;
}
}
ans += a-t;
}
printf("Case %d: ",T++);
cout<<ans<<endl;
} }
return 0;
}

HDU1695-GCD(数论-欧拉函数-容斥)的更多相关文章

  1. hdu1695(莫比乌斯)或欧拉函数+容斥

    题意:求1-b和1-d之内各选一个数组成数对.问最大公约数为k的数对有多少个,数对是有序的.(b,d,k<=100000) 解法1: 这个能够简化成1-b/k 和1-d/k 的互质有序数对的个数 ...

  2. hdu 1695 GCD(欧拉函数+容斥)

    Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...

  3. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. HDU 1695 GCD 欧拉函数+容斥定理

    输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...

  5. hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion

    http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不 ...

  6. bzoj 2818 GCD 数论 欧拉函数

    bzoj[2818]Gcd Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Samp ...

  7. HDU1695 GCD (欧拉函数+容斥原理)

    F - GCD Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  8. 【bzoj2818】: Gcd 数论-欧拉函数

    [bzoj2818]: Gcd 考虑素数p<=n gcd(xp,yp)=p 当 gcd(x,y)=1 xp,yp<=n满足条件 p对答案的贡献: 预处理前缀和就好了 /* http://w ...

  9. 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)

    题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...

随机推荐

  1. asp.net mvc 注册中的邮箱激活功能实现(二)

    邮件发送功能封装 /// <summary>        /// 发送注册邮件        /// </summary>        /// <param name ...

  2. 使用MIDAS访问远程Access数据库

    使用MIDAS访问远程Access数据库         Allen Tao(http://blog.csdn.net/allentao/) 2005-5-3 本文源码下载 访问远程数据库常用的办法是 ...

  3. NOI2011 Day2

    NOI2011 Day2 道路修建 题目描述:给出一棵树,求每条边的两边的端点数的差乘边权之和. solution: 题目可能描述得不太清楚,如图: 对于虚边,如果边权为10,两边的端点数之差为2,这 ...

  4. poj2405---体积几何

    #include <stdio.h> #include <stdlib.h> #include<math.h> #define pi acos(-1) int ma ...

  5. ubuntu下编译内核驱动。

    目的: 1. 驱动热身.网上有很多类似的文章可供参考. 2. 在操作系统中, 编写这个设备的驱动. 3. 为写qemu的watchdog驱动练手. 有朋友问make的 watchdog驱动 需要什么准 ...

  6. 用sqlserver处理excel表格

    本来最近在研究微信公众平台的,老大临时交我个任务,把excel表格里的数据导入sql数据库,我想这so easy嘛. 没想都在上面消磨了两天... 把情况介绍下:在数据库中有如下这样结构的表(A表) ...

  7. nodejs运用passport和passport-local分离本地登录

    var express = require('express'); var cookieParser = require('cookie-parser'); var bodyParser = requ ...

  8. 1.对于.NET的初步理解和介绍

    好久没写博客了,最近心情比较low,不知道为什么.很流行的一个问题叫做:如果你明天就挂了,那么你最后悔的事情将会是什么.我想了两个月,答案是不知道,无所谓.这样不好,那这个问题先放一边吧,我们开始这一 ...

  9. SQL Server 中的跨库视图

    SQL Server 中的跨库视图 在一个SQL中,有多个数据库,A.B.C,在使用C为连接库中,现在要查询A中的表T1. 那么,在C中建创视图(A_T1). SELECT *FROM A.dbo.T ...

  10. Archlinux 安装配置指导 2015-05-24

    因为用的Linode VPS的系统是Archlinux的,想在本地弄个系统做测试用,这样比较方便.然后发现自己在6年前做的一个Archlinux 安装配置Flash,好怀念的赶脚. 时过进迁,没想到A ...