101 Hack 6挑战赛中出现的问题探讨

时间:2013-06-30 04:09:44

标签: algorithm math

我参加了101 Hack六月挑战赛,但有两个问题我无法解决。任何人都可以给我一些关于如何处理这两个问题的提示:

Q1。 作业问题

凯文在学校有一个数学作业,他必须评估很多表达方式。凯文决定不浪费他的大部分时间。整体上有'M'表达。通过查看苏西的答案,加尔文认为所有问题的答案形成了一个非递减的序列。

他决定他的所有答案都在1和'N'之间(包括在内)。他用一个长度为'M'的随机非递减序列填充他的答题纸,其中每个元素在1和'N'之间。

这是凯尔文开始真正问题的部分。他不想选择大的N值,因为他会有很多选择可供选择。此外,如果他选择一个非常小的N值,很多答案将变得平等,老师会变得多可疑。

如果x =max1≤i≤N(频率(i)),则频率(i)是i在他选择的“M”值序列中出现的次数。凯文想要找出x的期望值。帮助他解决问题。

例如,如果M = 3& N = 3,可能的序列是:

1 1 1 (x = 3)
1 1 2 (x = 2)
1 1 3 (x = 2)
1 2 2 (x = 2)
1 2 3 (x = 1)
1 3 3 (x = 2)
2 2 2 (x = 3)
2 2 3 (x = 2)
2 3 3 (x = 2)
3 3 3 (x = 3)

expected value of x = 2.2

输入格式

第一行包含一个整数T,它指的是测试用例的数量。随后是T行,每行包含2个数字,M和N用于相应的测试用例。

约束

T ≤ 15
1 ≤ M ≤ 250
1 ≤ N ≤ 10^9

输出格式

输出T行,每行包含相应测试用例的答案。允许高达10 ^ -3的错误。

示例输入

4
1 5
3 3
2 9
9 6

示例输出

1.0000000000
2.2000000000
1.2000000000
4.3146853147

Q2。 GCD mocktail

反叛联盟和银河帝国在恩多之上的天空中进行了一场史诗般的战斗。盛大设置具有d维板,每个尺寸长度为“N”,(即)N×N ...(d次)。每个单元格(i1,i2,... id)都写有gcd(i1,i2,... id)。

现在,游戏开始了。选择一个随机整数L,并且第一个将每个模数为30000001的Lth幂的总和赢得比赛。

反叛联盟需要一些帮助并且会帮助你。如果他们赢了,你会得到一百万美元。你能帮忙吗?

输入格式

有几个测试用例。第一行包含测试用例数T.然后是T测试用例。每个测试用例以下列格式给出。 N和d在第一行中给出。 Q在第二行给出。 接下来的Q行中的每一行都包含整数L.

约束

0 <= T <= 10
1 <= N <= 107
1 <= d <= 1000
0 <= L <= 100
0 <= Q <= 50

输出格式

对于每个测试用例,输出Q行,表示答案。

示例输入

3
3 2
4
0
1
2
3
5 1
3
0
1
2
6 3
2
2
3

示例输出

9
12
20
42
5
15
55
421
975

这是网站问题的链接:

Q1。 https://www.hackerrank.com/contests/101june13/challenges/assignment

Q2。 https://www.hackerrank.com/contests/101june13/challenges/gcd-mocktail

比赛已经结束,所以我想在Stackoverflow上寻求帮助时不会作弊。

2 个答案:

答案 0 :(得分:1)

第二季度:

让我们先计算每个值出现在这样一个数组中的次数:

1 - 只要职位是互质的,就会出现。这很难直接计算,所以现在让我们把它留下来。

2 - 当所有位置都是2的倍数时出现。[1, N]的数字组合数是2的倍数,允许重复?第一个值有N / 2种可能性,所有其他d值都有(N / 2)^d种可能性,因此有(N / 4)^d + (N / 6)^d + ...种可能性。但是,我们还计算了那些都是LARGER倍数,这会产生更大的GCD。所以我们必须减去那些只有大倍数的形式,即k <= N

num(k) - 可以与上面相同推断。让N^d - num(2) - num(3) - ...为此值。

因此,1会出现S = num(1) + num(2) * 2^L + num(3) * 3^L + ... 次。

所以你必须计算总和:

O(N^2 * L)

如果您直接实施此解决方案,则会提供O(N^2 log L)N解决方案,因为10^7最长可达S,因此速度太慢。我们必须做得更好。

让我们写出S = N^d - num(2) - num(3) - ... + num(2) * 2^L + num(3) * 3^L + ... = N^d + num(2)(2^L - 1) + num(3)(3^L - 1) + ... = N^d + [(N / 2)^d - (N / 4)^d - ...](2^L - 1) + [(N / 3)^d - (N / 6)^d - ...](3^L - 1) + [(N / 4)^d - (N / 8)^d - ...](4^L - 1) + ...

{{1}}

很多术语都在重复,但到目前为止,我不知道从哪里开始。我会留下这个以防万一它可以帮助任何人进一步采取行动,如果有人发布完整的解决方案,我会删除它。

答案 1 :(得分:0)

对于Q1,假设您知道函数f(N, M, K)为您提供M1范围内N整数的非递减序列的方式#可能最多会重复K次。然后,f(N, M, K) - f(N, M, K-1)会为您提供重复K次的号码。现在我们得到了确切的分布,给出了确切的答案。

如果f(N, M, K)00 = K显然是0 < Mf(N, 0, 0)非常简单1。 (只有一个空集。)添加f(N, M, K) = f(N, M, K-1) + f(N-1, M-K, K)的事实,我们都将设置为动态编程解决。 (主要的挑战是,如果N为十亿,而M为250,则可能会超出浮点范围......)


我必须考虑Q2。我知道如何做到这一点,但对我来说并不是那么简单。