hdoj 1695 GCD

原创 2012年03月27日 20:51:09

思路:由题意可知求gcd(i, j) = k 满足i属于区间[a,b],j属于区间[c, d]. 进而转化成求gcd(i/k, j/k) = 1 满足i属于区间[1, b/k],j属于区间[1, d/k].即求两区间内互素数的对数有多少。

欧拉函数可求出所有小于等于n并且与n互素的数的个数。假设b<d,两区间内所有小于等于b的互素对数可由前b项欧拉数获得,剩下的是求区间[b+1,d]与区间[1, b]互素的数的对数。利用容斥原理,对于区间[b+1,d]的每项元素j,假设都和区间[1, b]互素,在排除掉b中与j有相同因子的项数。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>

using namespace std;

typedef __int64 lint;

const int MAX = 100009;

lint f[MAX],sum[MAX], tmp;
bool p[MAX]={0};
vector<int> v[MAX];

void init()
{
	int i, j;
	sum[1] = 1;
	for(i = 0; i < MAX; i++)
		f[i] = i;
	for(i = 2; i < MAX; i++)
	{
        if(p[i] == 0)
		{
			f[i] = i-1;
			v[i].push_back(i);
			for(j = i + i; j <= MAX; j += i)
			{
				p[j] = 1;
				f[j] *= i-1;
				f[j] /= i;
				v[j].push_back(i);
			}
		}
	}
    for (i = 2; i <= MAX; ++i)
        sum[i] = sum[i-1] + f[i];
}

void dfs(int k, int j, int b, int lcm, int mark) {
    if (k >= (int)v[j].size())
        return;
    int i;
    for (i = k; i < (int)v[j].size(); ++i) {
        if (v[j][i])
        tmp += mark*b/(v[j][i]*lcm);
        int t = v[j][i];
        dfs(i+1, j, b, t*lcm, -mark);
    }
}

int main()
{
    init();
    int i, j, ca, a, b, c, d, k;
    lint ans;
    scanf("%d", &ca);
    for (i = 1; i <= ca; ++i) {
        scanf("%d %d %d %d %d", &a, &b, &c, &d, &k);
        if (k == 0) {
            printf("Case %d: 0\n", i);
            continue;
        }
        if (b > d)
            swap(b, d);
        b /= k;
        d /= k;
        ans = sum[b];
        for (j = b+1; j <= d; ++j) {
            tmp = 0;
            dfs(0, j, b, 1, 1);
            ans += b - tmp;
        }
        printf("Case %d: %I64d\n", i, ans);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【容斥原理+欧拉函数】 HDOJ 1695 GCD

先转化成求区间1-b/k和区间1-d/k的

HDU/HDOJ 1695 GCD 欧拉函数+容斥原理

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1695   Problem Description Given 5 integers:...

HDOJ 1695 GCD(容斥+欧拉函数&&莫比乌斯反演+分块)

HDOJ 1695 GCD(容斥+欧拉函数&&莫比乌斯反演) Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c......

[HDU1695]GCD(莫比乌斯反演)

当形容词如女郎盛装、排比句如情人并肩,那就一定尚未进入文章之道。文章的极致如老街疏桐,桐下旧座,座间闲谈。

HDU 1695 GCD(phi函数+容斥)

Priblem LinkGCD 找出满足gcd(x,y)=k,x∈[1,b]y∈[1,d]gcd(x,y) = k,x \in[1,b] y \in[1,d]的对数Analyse要找到满足gcd(x...

HDU 1695 GCD (欧拉函数,容斥原理)

HDU 1695 GCD (欧拉函数,容斥原理)

hdu 1695 GCD 欧拉函数+容斥原理

#include #include #include #include #include #include using namespace std; #define LL __int64...

HDU 1695 GCD 解题报告(欧拉函数 + 容斥原理)

GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis...
  • kbdwo
  • kbdwo
  • 2014-03-07 09:05
  • 719

Hdu 1695 GCD - 欧拉函数 + 容斥

题目大意: 给定两个区间[1,b]和[1,d],x∈[1,b],y∈[1,d],问有多少种组合,使得gcd(x,y) = k。 题目分析: 将gcd(x,y) = k 化简得 gcd(x/k,y...

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

题意: 求1-b与1-d之间有多少组gcd=k的一对数。 思路: 令b=b/k,d=d/k,原题就变为了求1-b与1-d之间有多少互质的一对数。 假设b 对于[b+1,d]中,将每个数进行素...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)