首页 > 代码库 > HDU 4345
HDU 4345
细心点想,就明白了,题目是求和为N的各数的最小公倍数的种数。其实就是求N以内的各素数的不同的组合(包含他们的次方),当然,是不能超过N的。用Dp能解决。和背包差不多。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #define N 1010 7 #define LL __int64 8 using namespace std; 9 10 LL dp[N];11 12 int prim[N],np;13 bool isprime[N];14 15 void init(){16 np=0;17 memset(isprime,true,sizeof(isprime));18 for(int i=2;i<N;i++){19 if(isprime[i]){20 prim[++np]=i;21 for(int j=i*i;j<N;j+=i)22 isprime[j]=false;23 }24 }25 }26 27 int main(){28 init();29 int n,tmp;30 while(scanf("%d",&n)!=EOF){31 for(int i=0;i<=n;i++)32 dp[i]=1LL;33 bool flag=false;34 for(int k=1;k<=np;k++){35 if(prim[k]>n) break;36 for(int i=n;i>=0;i--){37 tmp=prim[k];38 while(i-tmp>=0){39 dp[i]+=dp[i-tmp];40 tmp*=prim[k];41 }42 }43 }44 printf("%I64d\n",dp[n]);45 }46 return 0;47 }
HDU 4345
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。