[恢]hdu 1058
2011-12-18 05:46:17
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1058
题意:找质因数只有2 3 5 7的第i个数。
mark:本来是dp,但是为了寻找一种新的比较好做的解法,可以这样做:
假设dp[i]表示第i个满足条件的数字,则dp[i]一定由前i-1个数字乘以2、3、5、7中的一个数得到。枚举前i-1个数每个乘以2、3、5、7,得到的不小于dp[i-1]的最小值为dp[i]。递推。复杂度应该是5000*5000*4,不过加优化勉强能过。
代码:
# include <stdio.h>
typedef long long ll ;
ll dp[6000] = {0, 1} ;
int main ()
{
int i, j, k, n ;
ll prime[4] = {2, 3, 5, 7} ;
ll min, num ;
char str[4][4] = {"st", "nd", "rd", "th"} ;
int idx ;
for (i = 2 ; i <= 5842 ; i++)
{
min = dp[i-1]* 7 ;
for (j = i-1 ; j >= 1 && dp[j] * 7 > dp[i-1]; j--)
{
for (k = 0 ; k < 4 ; k++)
{
num = prime[k] * dp[j] ;
if (num > dp[i-1] && num < min)
min = num ;
}
}
dp[i] = min ;
}
while (~scanf ("%d", &n) && n)
{
if (n % 10 == 1 && n % 100 != 11)
idx = 0 ;
else if (n % 10 == 2 && n % 100 != 12)
idx = 1 ;
else if (n % 10 == 3 && n % 100 != 13)
idx = 2 ;
else idx = 3 ;
printf ("The %d%s humble number is %I64d.\n", n, str[idx], dp[n]) ;
}
return 0 ;
}