HDU 2588 - GCD(欧拉函数)

版权声明:欢迎转载 https://blog.csdn.net/l18339702017/article/details/81911044
 

GCD

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3358    Accepted Submission(s): 1802


 

Problem Description

The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the largest divisor common to a and b,For example,(1,2)=1,(12,18)=6.
(a,b) can be easily found by the Euclidean algorithm. Now Carp is considering a little more difficult problem:
Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.

 

Input

The first line of input is an integer T(T<=100) representing the number of test cases. The following T lines each contains two numbers N and M (2<=N<=1000000000, 1<=M<=N), representing a test case.

 

Output

For each test case,output the answer on a single line.

 

Sample Input

 

3

1 1

10 2

10000 72

 

Sample Output

 

1

6

260

 

Source

ECJTU 2009 Spring Contest

题意:求 i <= n  且 gcd(i,n)>= m 的 i 的个数

思路 :对于所有小于n的最大公约数值一定是n的因子,所以,我们枚举每个符合条件的因子将其欧拉函数累加起来就好了。

#include <bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"-----------------"<<endl;

typedef long long ll;
const int maxn = 1e5+10;
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const int N = 1010;

ll n , m ;
ll Euler( ll n ){
     ll ans = 1;
	for(int i = 2 ;i * i <= n ;i++){
		if( n % i == 0){
			n /= i ;
			ans *= ( i - 1 );
			while( n % i == 0 ){
				n /= i ;
				ans *= i;
			}
		}
	}
	if (n > 1) ans *= (n - 1);
	return ans ;
}

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld", &n , &m);
		ll ans = 0;
		for(int i = 1; i * i <= n ;i++){
			if(n % i != 0) continue;
			if(i >= m && i * i != n) 
				ans += Euler(n / i);
			if(n / i >= m)
				ans += Euler(i);
		}
		printf("%lld\n", ans );
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/l18339702017/article/details/81911044