x,y <= N;
测试案例-N = 5
输出-6
说明-对为(1,2),(1,4),(2,3),(2,5),(3,4)
这个问题是在竞争性编程竞赛中提出的。我不知道该怎么做。有人有想法吗?
答案 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,就足够了。