1025: [SCOI2009]游戏 线性筛素数+DP

来源:互联网 发布:mysql 1054 编辑:程序博客网 时间:2024/05/22 06:41

题目即将N进行拆分,求各部分的LCM有几种。
我们考虑对于一个可能的LCM的值,如果这个值可以由不互质的几部分得到,那么它一定可以由互质的几部分得到。
那么就可以先线性筛出素数。然后把每个素数的k(k=1,2,3…)看成物品往背包里装,就成了简单DP啦。

#include<iostream>#include<cstdio>#define ll long long using namespace std;int prime[1005];int n;ll f[1005][1005],ans;bool flag[1005];inline void get_prime(){    for (int i=2;i<=n;i++)    {        if (!flag[i]) prime[++prime[0]]=i;        for (int j=1;j<=prime[0]&&i*prime[j]<=n;j++)        {            flag[i*prime[j]]=1;            if (i%prime[j]==0) break;        }    }}int main(){    scanf("%d",&n);    get_prime();    f[0][0]=1;    for (int i=1;i<=prime[0];i++)    {        for (int j=0;j<=n;j++) f[i][j]=f[i-1][j];        for (int j=0;j<=n;j++)            for (int k=prime[i];k<=j;k*=prime[i])                f[i][j]+=f[i-1][j-k];    }    for (int i=0;i<=n;i++) ans+=f[prime[0]][i];    cout << ans << endl;    return 0;}   
0 0
原创粉丝点击