Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 주어진 숫자와 같은 GCD를 가진 집합의 부분집합 수를 센다.

<시간/>

양수를 포함하는 배열 ar와 gcd 값을 포함하는 배열 GCD[]가 주어지면 목표는 GCD[]에 주어진 gcd 값을 갖는 arr[] 요소의 하위 집합 수를 찾는 것입니다.

입력

arr[] ={10, 5, 6, 3}, GCD[] ={2, 3, 5}

출력

GCD가 주어진 숫자와 동일한 집합의 부분집합 수:1 2 2

설명

GCD가 2인 부분집합은 [ 10, 6 ]입니다. GCD가 3인 부분집합은 [ 3 ], [ 6,3 ]GCD가 5인 부분집합은 [ 5 ], [ 10, 5 ] 

입력

arr[] ={10, 21, 7, 8}, GCD[] ={2, 7, 5}

출력

GCD가 주어진 숫자와 동일한 집합의 부분집합 개수:12 0

설명

GCD가 2인 부분집합은 [ 10, 8 ]입니다. GCD가 7인 부분집합은 [ 7 ], [ 21,7 ]GCD가 5인 부분집합이 없습니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다. -

이 접근 방식에서 우리는 arr[] 요소의 빈도를 저장하기 위해 unordered_map um_1을 만들고 주어진 gcd를 가진 부분 집합의 수를 저장하기 위해 유사한 맵 um_2를 만들 것입니다. rr[]의 요소 중 최대값을 count로 취합니다. 이제 i=count에서 i>=1까지 루프를 실행하고 현재 gcd에 대한 하위 집합의 수를 찾습니다. 이를 위해 um_1에 있는 i의 배수를 계산합니다. i의 배수가 전체라면 gcd i가 있는 부분집합의 수는 total2−1−temp입니다. 여기서 temp는 gcd가 i보다 크지만 i와 같지 않은 부분 집합의 수입니다.

  • arr[] 및 GCD[]에 대해 두 개의 배열을 사용합니다.

  • 함수 subset_GCD(int arr[], int size_arr, int GCD[], int size_GCD)는 배열과 배열의 길이를 모두 취하고 GCD가 주어진 숫자와 동일한 집합의 하위 집합 수를 반환합니다.

  • 함수 subset_GCD(int arr[], int size_arr, int GCD[], int size_GCD)는 배열과 배열의 길이를 모두 취하고 GCD가 주어진 숫자와 동일한 집합의 하위 집합 수를 반환합니다.

  • 초기 카운트를 0으로 합니다.

  • for 루프를 사용하여 arr[]을 탐색하고 최대값으로 업데이트 횟수를 찾고 um_1[arr[i]]++을 사용하여 빈도로 um_1을 업데이트합니다.

  • i=count에서 i>=1까지의 for 루프를 사용하여 i의 배수의 빈도의 합으로 합계를 취하고 i보다 크지만 i와 같지 않은 gcd를 갖는 부분 집합의 수로 temp=0을 취합니다.

  • j=2에서 j*i<=count로 다시 트래버스하고 um_1[j*i]를 total에 추가하고 um_2[j*i]를 temp에 추가합니다.

  • 두 for 루프가 모두 끝난 후 um_2[i] =(1<로 설정합니다.

  • GCD가 지정된 부분 집합 수가 있는 결과 배열에 대해 um_2[GCD[i]]를 인쇄합니다.

예시

#include네임스페이스 std;void 부분집합_GCD(int arr[], int size_arr, int GCD[], int size_GCD){unordered_map um_1, um_2; 정수 개수 =0; for (int i=0; i=1; i−−){ int temp =0; 정수 합계 =um_1[i]; for (int j =2; j*i <=count; j++){ total +=um_1[j*i]; 온도 +=um_2[j*i]; } um_2[i] =(1<<총) − 1 − 온도; } cout<<"GCD가 주어진 숫자와 같은 집합의 부분집합 개수:"; for (int i=0; i 

출력

위의 코드를 실행하면 다음 출력이 생성됩니다 -

GCD가 주어진 숫자와 같은 집합의 부분집합 개수:2 1