hdu 1695 GCD 莫比乌斯

GCD

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9765    Accepted Submission(s): 3652

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).

Source

2008 “Sunline Cup” National Invitational Contest

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define esp 0.00000000001
#define pi 4*atan(1)
const int N=1e5+10,M=1e7+10,inf=1e9+10,mod=1e9+7;
int mu[N], p[N], np[N], cnt, sum[N];
void init() {
    mu[1]=1;
    for(int i=2; i<N; ++i) {
        if(!np[i]) p[++cnt]=i, mu[i]=-1;
        for(int j=1; j<=cnt && i*p[j]<N; ++j) {
            int t=i*p[j];
            np[t]=1;
            if(i%p[j]==0) { mu[t]=0; break; }
            mu[t]=-mu[i];
        }
    }
}
int main()
{
    int T,cas=1;
    init();
    scanf("%d",&T);
    while(T--)
    {
        int a,b,c,d,k;
        scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
        if(k==0)
        {
            printf("Case %d: 0\n",cas++);
            continue;
        }
        b/=k,d/=k;
        if(b>=d)swap(b,d);
        ll ans=0;
        for(int i=1;i<=b;i++)
        {
            ans+=(ll)mu[i]*(b/i)*(d/i);
        }
        ll ans2=0;
        for(int i=1;i<=b;i++)
        {
            ans2+=(ll)mu[i]*(b/i)*(b/i);
        }
        printf("Case %d: %lld\n",cas++,ans-ans2/2);
    }
    return 0;
}
时间: 2024-11-04 16:17:53

hdu 1695 GCD 莫比乌斯的相关文章

HDU 1695 GCD 莫比乌斯第二发

题意:求[1,b]和[1,d]内公约数为k的对数(错了N发之后才看到a和c为1...) 解一:容斥原理和欧拉函数 http://www.cnblogs.com/kuangbin/p/3269182.html 参考大神的文章吧,我没写=-= 解二:莫比乌斯 设f[x]为GCD(a,b)=k的对数 F[x]为k|x的对数 所以b,d均除k就是求所有GCD为1的对数 sum+=sigema(mu[i]*(b/i)*(d/i)) #include <stdio.h> #include <stri

HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a <= b <= 100000, c=1, c <= d <= 100000, 0 <= k <= 100000) 思路:因为x与y的最大公约数为k,所以xx=x/k与yy=y/k一定互质.要从a/k和b/k之中选择互质的数,枚举1~b/k,当选择的yy小于等于a/k时,可以

HDU 1695 GCD (数论-整数和素数,组合数学-容斥原理)

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(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 t

HDU 1695 GCD(莫比乌斯反演)

[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1695 [题目大意] 求出区间[1,b][1,d]中公约数为k的对数,重复的对数只计算一次. [题解] 我们将b和d调整成b<=d,题目转化为[1,b/k][1,d/k]中互质的数对数,由于重复的对数只计算一次,因此需要再计算一次[1,b/k][1,b/k],用原先答案减去计算出的一半就是答案. [代码] #include <cstdio> #include <algorithm&g

hdu 1695 GCD(莫比乌斯入门)

题意:求a<=x<=b ,x<=y<=d,中gcd(x,y)==k的数对个数 思路:题目可以转化成求1<=x<=b/k,1<=y<=d/k中gcd(x,y)=1的数对的个数 我们设f(d)表示恰好gcd(x,y)==d的个数,F(d)表示gcd为d的倍数的数对个数 F(n)=∑d|nf(d)=> f(d)=∑d|nu(d)F(n/d) 令p=b/k q=d/k F(d)的计算十分简单 floor(p/d)*floor(q/d) 再利用线性筛法求莫比乌斯

HDU 1695 GCD (莫比乌斯反演)

传送门 GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9749    Accepted Submission(s): 3648 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)

HDU 1695 GCD 【莫比乌斯反演例题】

GCDTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4291 Accepted Submission(s): 1502   Problem DescriptionGiven 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k.

莫比乌斯二连 HDU 5212 Code &amp; HDU 1695 GCD

莫比乌斯的模板题 都是差不多的 F(m)为gcd(i,j) = m(i∈[1,m],j∈[1,n])的个数 f(m) = ∑(m\d) F(d)  意义为gcd(i,j)为m的倍数的个数 运用莫比乌斯反演得到 F(m) = ∑(m\d)μ(d/m) * f(d) #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;

HDU 1695 GCD(容斥 or 莫比乌斯反演)

这题可以用容斥做,然而效率并不高.. 于是学了下莫比乌斯反演(资料百度找) 求出mo数组后 设f(x)为gcd为x的种数 F(x)为gcd为x倍数的种数 那么显然F(x) = (b / x) * (d / x) 莫比乌斯反演之后,得到f(x) = sum(mo[i] * F(i)). 然后还要容斥减去对称重复的.对称重复的情况为min(b, d)小的中,求一遍除2,(因为存在x = y的情况只有(1,1)一种) 最后还要注意特判下k == 0的情况 代码: #include <cstdio>