【编程问题】猜数字游戏

时间限制:1秒

空间限制:32768K

这个问题比较难。

首先,采用动态规划的思想

首先我们分析dp[i]表示前I个数的合法个数。

当第I个数是质数时,除了1,什么都不能除,所以可以随意选择Y或N,所以dp[i] = dp[i-1]。

当第I个数不是素数的幂时,比如610,那么他们的情况实际上是由前面的数决定的。对于6,如果2,3是YY,那么6一定是Y,其他情况6一定是N,所以dp[i] = dp[i-1]。

当第I个数是一个素数的幂,即2,4,8,16时,情况就复杂了。假设现在有2个,4个,8个,那么有多少种情况?仔细分析也能找到规律。

YYY,YNN,NNN,YYN在这四种情况下。

对于2,4

Yn,YY和NN。

我们发现其实是有规律的,首先你可以或者不可以两者兼得,然后你从左到右加y:

YNN,YYN .

所以在这种情况下,我们得到这样的规律:如果有n次方,则在n+1中存在可行的情况。

经过分析,我们可以得到计算方法。对于12:

2,4,8这三个数字是幂,有四种可能。

3和9的幂有三种可能。

5,7,11,分别是两种可能。

其他数字由其他数字决定。

所以最终结果是4 3 2 2 2。

所以当我们思考这个问题的时候,我们最终变成了寻找质数和质幂的个数。