特殊配对至N

时间:2019-07-28 16:15:41

标签: algorithm

给出一个数字N(1 <= N <= 10 ^ 50),找到唯一对(x,y)的数量,使得x的位数和y的位数为质数。

x,y <= N;
测试案例-N = 5
输出-6
说明-对为(1,2),(1,4),(2,3),(2,5),(3,4)

注意-(x,y),(y,x)是等效的。因此,如果包含(2,5),则(5,2)不包含。

这个问题是在竞争性编程竞赛中提出的。我不知道该怎么做。有人有想法吗?

1 个答案:

答案 0 :(得分:1)

观察1: 您要考虑的素数小于1000。 (因为数字<= 10 ^ 50的所有数字的总和为<= 50 * 9 <= 500)

观察2: 只有一对(x,x)为您提供素数。 (什么是(1,1),因为1 +1 = 2,对于任何x,您都会得到一个偶数,该偶数必须是2或不是素数)

假设您有一个向导朋友,它告诉了给定n的所有函数f的结果,其中f(x)=小于n的数字的个数之和等于x。

现在找到所有最大为1000的素数,并为每个x从0到500以及每个p-素数计算f(x)* f(p-x)。 您计算出的值的总和等于2 *答案-1。(由于重复,并且(1,1)是x = y的唯一对(x,y),并且给出质数)。因此,您最多只能检查500 * 1000个可能性。

剩下的唯一事情就是计算函数f。

您可以使用动态编程来实现。

让g(x,d,e)=位数之和等于x的d位数字的数量。如果e = 1,则您考虑的数字等于n的前d位数字,否则较小。

x <= 500,d <= 50,e <= 1

您可以轻松地看到多达500 * 50 * 2个状态。

假设您知道g的所有先前值,并且想要计算g(x,d,0)。

您可以使用任何d-1位数字,并为每个0 <= y <= 9添加一个数字y。由于要获得x,因此它以前的数字总和必须等于x-y。您还希望它小于n,因此取g(x-y,d-1,0),如果y小于n的dth位,则还要加上g(x-y,d-1,1)。 / p>

g(x,d,1)的公式:

您可以输入任何d-1位数字,并添加一个y等于n的第d位的数字y。那么您的结果就是g(x-y,d-1,1)。

要考虑的不同选项数等于500 * 50 * 2 * 10,就足够了。