1025: [SCOI2009]游戏
题目:
http://www.lydsy.com/JudgeOnline/problem.php?id=1025
问题相当于一个各项之和为N的正整数序列,求所有这样的序列中的各数的最小公倍数有多少种。
设最小公倍数为m,则m=p1^a1*p2^a2...。
而对于一个m,存在一个序列的最小公倍数为m的充要条件是p1^a1+p2^a2+....<=n。
预处理出n以内的质数后,用类似背包Dp的递推统计即可。
#include
<
iostream
>
#include
<
cstdio
>
#include
<
cstring
>
#include
<
cstdlib
>
#include
<
cmath
>
using
namespace
std;
const
int
MaxN
=
1051
;
int
n,tot
=
0
;
unsigned
long
long
f[MaxN],tmp[MaxN],ans
=
0
;
int
ss[MaxN];
bool
vis[MaxN];
void
treat()
{
for
(
int
i
=
2
;i
<=
n;i
++
)
{
if
(vis[i]
==
0
)
{
ss[tot
++
]
=
i;
vis[i]
=
1
;
}
for
(
int
j
=
0
;j
<
tot
&&
ss[j]
*
i
<=
n;j
++
)
{
vis[ss[j]
*
i]
=
1
;
if
(i
%
ss[j]
==
0
)
{
break
;
}
}
}
}
int
main()
{
cin
>>
n;
treat();
f[
0
]
=
1
;
for
(
int
i
=
0
;i
<
tot;i
++
)
{
memcpy(tmp,f,
sizeof
(f));
for
(
int
j
=
ss[i];j
<=
n;j
*=
ss[i])
{
for
(
int
k
=
j;k
<=
n
&&
k
-
j
>=
0
;k
++
)
{
f[k]
+=
tmp[k
-
j];
}
}
}
for
(
int
i
=
1
;i
<=
n;i
++
)
{
ans
+=
f[i];
}
cout
<<
ans
+
1
<<
endl;
return
0
;
}
posted on 2013-02-08 23:44
Kiro
阅读(209)
评论(0)
编辑
收藏
引用
所属分类:
衡八oj
只有注册用户
登录
后才能发表评论。
相关文章:
1055: [HAOI2008]玩具取名
1054: [HAOI2008]移动玩具
1051: [HAOI2006]受欢迎的牛
1050: [HAOI2006]旅行comf
1046: [HAOI2007]上升序列
1042: [HAOI2008]硬币购物
1037: [ZJOI2008]生日聚会Party
1034: [ZJOI2008]泡泡堂BNB
1029: [JSOI2007]建筑抢修
1027: [JSOI2007]合金
网站导航:
博客园
博客园最新博文
博问
管理
4myOI
再给我一次机会将故事改写。
导航
C++博客
首页
新随笔
联系
聚合
管理
统计
随笔 - 0
文章 - 27
评论 - 0
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
文章分类
■
hdu(1)
(rss)
■
poj(2)
(rss)
■
衡八oj(24)
(rss)
■
其他
(rss)
文章档案
■
2013年2月 (17)
■
2013年1月 (3)
■
2012年10月 (3)
■
2012年9月 (1)
■
2012年3月 (1)
■
2012年2月 (2)
搜索
最新评论