首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

hdu4345 Permutation-多校联结五

2012-09-08 
hdu4345 Permutation-----多校联合五这题首先是道数学题,用到了置换群的概念,其实是求相加和为N的最小公倍

hdu4345 Permutation-----多校联合五

这题首先是道数学题,用到了置换群的概念,其实是求相加和为N的最小公倍数的种类数,把数学思想抽象出来就成一道dp题了。

 

#include<iostream>#include<cstdlib>#include<stdio.h>#define ll __int64using namespace std;const int N=1000;int prime[N]={0},num=1;int isprime[N]={1,1};ll dp[200][1010];void sushu(){    for(int i=2;i<N;i++)    {        if(!isprime[i])        prime[num++]=i;        for(int j=1;j<num&&i*prime[j]<N;j++)        {            isprime[i*prime[j]]=1;            if(!(i%prime[j]))            break;        }    }}int main(){    sushu();    //cout<<num<<endl;    dp[0][0]=1;    num--;    for(int i=1;i<=num;i++)    {        for(int j=0;j<=1000;j++)        dp[i][j]=dp[i-1][j];//前i个质数和为j的不同最小公倍数个数        int res=prime[i];        while(res<=1000)        {            for(int j=0;j+res<=1000;j++)            if(dp[i-1][j]) dp[i][j+res]+=dp[i-1][j];            res*=prime[i];        }    }    int n;    while(scanf("%d",&n)!=EOF)    {        ll ans=0;        for(int j=1;j<=n;j++)        ans+=dp[num][j];        printf("%I64d\n",ans+1);    }}


 

热点排行