您的位置:首页 > 其它

AC日记——[SCOI2009]游戏 bzoj 1025

2017-06-15 22:08 357 查看
[SCOI2009]游戏

思路:

  和为n的几个数最小公倍数有多少种。

  dp即可;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 1005
#define ll long long
int n,num;
ll dp[maxn][maxn],pi[maxn];
bool if_p[maxn];
void euler(int limit)
{
for(int i=2;i<=limit;i++)
{
if(!if_p[i]) pi[++num]=i;
for(int j=1;pi[j]*i<=limit&&j<=num;j++)
{
if_p[i*pi[j]]=true;
if(i%pi[j]==0) break;
}
}
}
int main()
{
scanf("%d",&n),euler(n);
dp[0][0]=1;
for(int i=1;i<=num;i++)
{
for(int v=0;v<=n;v++)
{
dp[i][v]=dp[i-1][v];
for(ll pos=pi[i];pos<=v;pos*=pi[i])
{
dp[i][v]+=dp[i-1][v-pos];
}
}
}
ll ans=0;
for(int i=1;i<=n;i++) ans+=dp[num][i];
cout<<ans+1;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: