生成给出GCD的数字列表

时间:2015-10-25 06:51:23

标签: algorithm math greatest-common-divisor

我得到了两个数字,说G& ñ。找到n个数字[A0,A1,A2,....... Ai,.....,Aj ... An]的所有可能列表,其gcd为G遵循以下约束:

  • GCD(A0,A1,A2,....,Ai,.....,An-1)= G。
  • Ai&gt; G,∀0≤i< Ñ
  • Ai≥Aj,∀j≤i

    定义一个函数,sum(A)= A0 + A1 + .... + An-1。 如果多个序列满足前三个属性,则打印最小化sum(A)函数的那个​​。

示例:G = 4,N = 3.所以可能的数字列表:[8,12,20]。

我的方法:我生成一个n个素数的列表,并为所有0&lt; = j&lt;&lt; = j&lt; ñ。但这似乎没有用。

public class GeneratingSequence {

    private static int MAX = 1000;
    private static int MAX1 = 8000;

    private void sieve(int[] a)
    {
        boolean[] b = new boolean[MAX1];
        int aIndex = 0;

        for(int i = 1; i < MAX1; i++)
        {
            if(!b[i])
            {
                //System.out.print((i + 1) + " ");

                if(aIndex < a.length)
                    a[aIndex++] = i + 1;

                markMultiples(i + 1, b);
            }
        }
    }

    private void markMultiples(int n, boolean[] b)
    {
        int i = 2, num;

        while((num = i * n) <= MAX1)
        {
            b[num - 1] = true;
            i++;
        }
    }

    public static void main(String[] args) throws NumberFormatException, IOException
    {
        GeneratingSequence gs = new GeneratingSequence();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int[] primes = new int[MAX];

        gs.sieve(primes);

        int T = Integer.parseInt(br.readLine());

        for(int i = 0; i < T; i++)
        {
            String[] a = br.readLine().split("\\s");
            long g = Long.parseLong(a[0]);
            int n = Integer.parseInt(a[1]);

            for(int j = 0; j < n; j++)
            {
                long t = g*primes[j];
                System.out.print(t + " ");
            }

            System.out.println();
        }
    }
}

1 个答案:

答案 0 :(得分:3)

第一个约束告诉我们所有A必须是G的整数倍,让我们说A i = F i * G和F <的gcd sub> i 必须为1.

从第二个约束我们知道F i &gt; = 2。

第三个约束表示序列必须是非递减的。

满足所有三个约束的序列是:

[2 * G,2 * G,2 * G,...,2 * G,3 * G]

并且此序列也具有最小的总和。