【问题标题】:Generate list of numbers whose GCD is given生成给定 GCD 的数字列表
【发布时间】:2015-10-25 06:51:22
【问题描述】:

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

  • GCD (A0, A1, A2, .... ,Ai, ..... ,An-1) = G.
  • Ai > G, ∀ 0 ≤ i
  • Ai ≥ Aj, ∀ j ≤ i

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

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

我的方法:我生成一个包含 n 个素数的列表,并为所有 0

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();
        }
    }
}

【问题讨论】:

  • 确定这是任务吗?因为除非我遗漏了什么,否则 GCD( 2*G , 3*G , 4*G, 5*G, ... (n+1)*G ) = G 太简单了,可以解析求解。
  • 我认为 [2G, 3G, 3G, 3G, ...] 对任何 n 来说都是一个有效的序列吗?
  • 那么@Henry 有正确答案,而 [8, 12, 20] 不是(试试看,GCD(8, 12, 12) i>)
  • 这是来自正在进行的比赛的问题hackerearth.com/zomato-hiring-challenge/problems/…
  • @Death-Stalker: [2G, 2G, ..., 2G] 的 gcd 是 2G,而不是 G。但是,比亨利的答案更好的是 [3G, 2G, 2G, .. ., 2G].

标签: algorithm math greatest-common-divisor


【解决方案1】:

第一个约束告诉我们所有 A 必须是 G 的整数倍,假设 Ai = Fi*G 并且 F 的 gcdi 必须为 1。

从第二个约束我们知道 Fi >= 2。

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

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

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

而且这个数列的和也是最小的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多