입력 N이 주어집니다. 목표는 1<=A<=N 및 1<=B<=N 및 GCD(A, B)가 B가 되도록 A, B의 모든 쌍을 찾는 것입니다. 모든 쌍은 공약수 B.
예를 들어 이해합시다.
입력 - N=5
출력 − gcd(A , B)가 B가 되도록 쌍(A <=N, B <=N)의 개수를 셉니다. − 10
설명
pairs (A <= N, B <= N) such that gcd (A , B) is B are − (1,1), (2,1),(3,1),(4,1),(5,1),(2,2),(3,3),(4,2),(4,4), (5,5). Total 10.
입력 - N=50
출력 − gcd(A , B)가 B가 되는 쌍(A <=N, B <=N)의 개수를 셉니다. − 207
설명
pairs (A <= N, B <= N) such that gcd (A , B) is B are : (1,1), (2,1),(3,1),(4,1),(5,1).....(50,1) (2,2),(3,3),(4,4).....(50,50)
유사하게 (4,2), (6,3), (8,2),(8,4),............(50,25)와 같은 다른 쌍. 총 207
아래 프로그램에서 사용한 접근 방식은 다음과 같습니다.
주어진 문제를 해결하기 위한 여러 가지 접근 방식, 즉 순진한 접근 방식과 효율적인 접근 방식이 있을 수 있습니다. 먼저 순진한 접근 방식을 살펴보겠습니다. .
-
정수 N을 입력으로 받습니다.
-
함수 GCD(int A, int B)는 두 개의 정수를 취하고 A와 B의 최대 공약수를 반환합니다. gcd를 재귀적으로 계산합니다.
-
A 또는 B 중 하나가 0이면 다른 하나를 반환합니다. 둘 다 같으면 두 값 중 하나를 반환합니다. A>B인 경우 (A-B,B)를 반환합니다. B가 더 크면 gcd(B-A,A)를 반환합니다. 결국 우리는 gcd 값을 얻습니다.
-
count_pairs(int N) 함수는 N을 취하고 pair(A,B)에서 B가 gcd이고 둘 다 [1,N] 범위에 있도록 쌍의 수를 반환합니다.
-
이러한 쌍의 수에 대해 초기 값을 count =0으로 취하십시오.
-
쌍의 각 값에 대해 루프 i=1에서 A에 대해 i=N까지 실행하고 B에 대해 루프 j=1 t j=N에 대해 중첩합니다.
-
쌍(i,j)을 만들고 GCD(i,j)에 전달합니다. 결과가 j와 같으면. 증분 수.
-
두 루프의 끝에서 결과로 count를 반환합니다.
효율적인 접근
우리가 볼 수 있듯이 gcd(a,b)=b는 a가 항상 b의 배수임을 의미합니다. N보다 작은 b(1<=b<=N)의 모든 배수는 쌍을 만듭니다. 숫자 i의 경우 i의 배수가 floor(N/i)보다 작으면 계산됩니다.
-
count_pairs(int N) 함수는 N을 취하고 pair(A,B)에서 B가 gcd이고 둘 다 [1,N] 범위에 있도록 쌍의 수를 반환합니다.
-
이러한 쌍의 수에 대해 초기 값을 count =0으로 취하십시오.
-
임시 변수 temp=N 및 i=1을 사용합니다.
-
while(i<=N)을 사용하여 다음을 수행합니다.
-
각각에 대해 j=N/temp
로 배수의 한계를 계산합니다. -
현재 i의 쌍 수는 temp*(i-j+1)입니다. 개수에 추가합니다.
-
i=j+1로 설정합니다. (A,B)의 다음 B를 위해.
-
다음 반복을 위해 temp=N/i를 설정합니다.
-
while 루프가 끝나면 결과로 count를 반환합니다.
예시(순진한 접근)
#include <iostream> using namespace std; int GCD(int A, int B){ if (A == 0){ return B; } if (B == 0){ return A; } if (A == B){ return A; } if (A > B){ return GCD(A-B, B); } return GCD(A, B-A); } int count_pairs(int N){ int count = 0; for(int i=1; i<=N; i++){ for(int j = 1; j<=N; j++){ if(GCD(i, j)==j){ count++; } } } return count; } int main(){ int N = 4; cout<<"Count number of pairs (A <= N, B <= N) such that gcd (A , B) is B are: "<<count_pairs(N); return 0; }
출력
위의 코드를 실행하면 다음 출력이 생성됩니다 -
Count number of pairs (A <= N, B <= N) such that gcd (A , B) is B are: 8
예(효율적인 접근)
#include <bits/stdc++.h> using namespace std; int Count_pairs(int N){ int count = 0; int temp = N; int i = 1; while(i <= N){ int j = N / temp; count += temp * (j - i + 1); i = j + 1; temp = N / i; } return count; } int main(){ int N = 4; cout<<"Count number of pairs (A <= N, B <= N) such that gcd (A , B) is B are: "<<Count_pairs(N); return 0; }
출력
위의 코드를 실행하면 다음 출력이 생성됩니다 -
Count number of pairs (A <= N, B <= N) such that gcd (A , B) is B are: 8