UVa:884 Factorial Factors

 

简单动规,1Y。

dp[i]表示i!最多可以用多少整數相乘。dpst[i]表示i最多可以用多少整数相乘。

如果i是素数,dp[i]=dp[i-1]+1。

如果不是,dp[i]=dp[i-1]+dpst[i]。

 

dpst:

如果i是素数dpst[i]=1。

如果不是,dpst[i]=dpst[j]+dpst[k] (i==j*k)。

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 1000000
using namespace std;
int dp[MAXN +5];
int dpst[MAXN +5];
int divi[80000];
bool p[MAXN+5];
int N=0;
int Factor(int val)
{
    for(int i=0; i<N; ++i)
        if(val%divi[i]==0)
            return dpst[divi[i]]+dpst[val/divi[i]];
}
int main()
{
    for(int i=2; i<=MAXN; ++i)
        for(int j=i+i; j<=MAXN; j+=i)
            if(!p[j]) p[j]=true;
    for(int i=2; i<=MAXN; ++i)
        if(!p[i]) divi[N++]=i;
    for(int i=2; i<=MAXN; ++i)
        if(!p[i]) dp[i]=dp[i-1]+(dpst[i]=1);
        else dp[i]=dp[i-1]+(dpst[i]=Factor(i));
    int n;
    while(scanf("%d",&n)!=EOF)
        printf("%d\n",dp[n]);

    return 0;
}


 

你可能感兴趣的:(动态规划)