[BaekJoon]9613 GCD合計


1.  質問リンク


https://www.acmicpc.net/problem/9613

2.  質問する



サマリ


n個の整数
  • が与えられた場合、問題は可能なすべてのGCDの和を求めることである.
  • 入力
  • 第1行にはテストケースの数があり、第2行から始まるn行には各テストケースがある.
  • 各テストエンクロージャの数は、テストエンクロージャの数よりも優先され、次いでn個である.
  • 出力:各テストエンクロージャにおいて、可能なすべてのGCDの和をテストエンクロージャの順序で出力します.
  • 3.  ソースコード

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.StringTokenizer;
    
    public class Main {
    	public int gcd(int a, int b) {
    		if(b == 0) {
    			return a;
    		} else {
    			return gcd(b, a % b);
    		}
    	}
    	
    	public long[] getGCDSum(String[] testcase) {
    		long[] result = new long[testcase.length];
    		for(int i = 0; i < testcase.length; i++) {
    			StringTokenizer st = new StringTokenizer(testcase[i]);
    			int num = Integer.parseInt(st.nextToken());
    			int[] nums = new int[num];
    			for(int j = 0; j < num; j++) {
    				nums[j] = Integer.parseInt(st.nextToken());
    			}
    			long sum = 0;
    			int gcd = 0;
    			for(int j = 0; j < nums.length - 1; j++) {
    				for(int k = j + 1; k < nums.length; k++) {
    					if(nums[j] < nums[k]) {
    						gcd = gcd(nums[k], nums[j]);
    					} else {
    						gcd = gcd(nums[j], nums[k]);
    					}
    					sum += gcd;
    				}
    			}
    			result[i] = sum;
    		}
    		return result;
    	}
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    		int test_num = Integer.parseInt(br.readLine());
    		String[] testcase = new String[test_num];
    		for(int i = 0; i < test_num; i++) {
    			testcase[i] = br.readLine();
    		}
    		br.close();
    		Main m = new Main();
    		long[] result = m.getGCDSum(testcase);
    		for(int i = 0; i < result.length; i++) {
    			bw.write(result[i] + "\n");
    		}
    		bw.flush();
    		bw.close();
    	}
    }

    4.  に近づく


  • テストケースでは、所与の数のすべての可能なペアを検索し、これらのペアに対して最大承諾数を求め、その後、すべての可能なペアを加えればよい.
  • の最大公約数を求める場合、ユークリッドアーク除算法を採用するため、ペアの2つの数のうち、大きい数が1番目のパラメータビットに入り、他の数が2番目のパラメータビットに入る.
  • ユークリッドアーク除算法を用いて,求めた最大公約数を加算し,ペアリング可能なすべてのGCDの和を求め,すべてのテストケースを計算した.