[BZOJ 1025] SCOI 2009 游戏 · 动态规划
2015-04-08 21:28
288 查看
首先提醒一下记得开long long
一开始没看出来是个DP愣是想了半天T^T
首先我们打个表找规律:
如果再手推几个数就不难发现对于一个数i,如果把i拆成p+q,p的一种排数是s1,q的一种排数是s2,那么i的一种排数就是lcm(s1,s2)
那么我们假设把i所有可能的排数全部存到p[i]里,那么对于任意一个p[i][j],一定有p[i][j]=lcm(p[i'][j'],p[i''][j''])且i'+i''=i。
另外不难发现,i=(i-1)+1,所以i的排数肯定包含i-1的全部排数,那么我们可以想到来枚举质数。
但是这样优化的暴力是肯定过不了了,蒟蒻笔者想到这里就卡住了。。。然后看了一下题解感觉茅塞顿开啊!
把这些理解了,就可以再接着看这篇(这篇对前面部分的推导没做详细解释):http://www.cnblogs.com/iwtwiioi/p/4104385.html
一开始没看出来是个DP愣是想了半天T^T
首先我们打个表找规律:
如果再手推几个数就不难发现对于一个数i,如果把i拆成p+q,p的一种排数是s1,q的一种排数是s2,那么i的一种排数就是lcm(s1,s2)
那么我们假设把i所有可能的排数全部存到p[i]里,那么对于任意一个p[i][j],一定有p[i][j]=lcm(p[i'][j'],p[i''][j''])且i'+i''=i。
另外不难发现,i=(i-1)+1,所以i的排数肯定包含i-1的全部排数,那么我们可以想到来枚举质数。
但是这样优化的暴力是肯定过不了了,蒟蒻笔者想到这里就卡住了。。。然后看了一下题解感觉茅塞顿开啊!
把这些理解了,就可以再接着看这篇(这篇对前面部分的推导没做详细解释):http://www.cnblogs.com/iwtwiioi/p/4104385.html
#include <stdio.h> #include <algorithm> #include <string.h> #include <iostream> using namespace std; #define ll long long const int maxn=1005; ll n,f[maxn][maxn],p[maxn],tot,ans; void init(){ tot=0; bool check[maxn]; memset(check,1,sizeof check); for (ll i=2;i<=n;i++){ if (check[i]) p[++tot]=i; for (ll j=1;j<=tot && p[j]*i<=n;j++) check[p[j]*i]=0; } return ; } int main(){ cin>>n; init(); memset(f,0,sizeof f); f[0][0]=1; for (ll i=1;i<=tot;i++) for (ll j=0;j<=n;j++){ f[i][j]=f[i-1][j]; for (ll k=p[i];k<=j;k*=p[i]) f[i][j]+=f[i-1][j-k]; } ans=0; for (ll i=0;i<=n;i++) ans+=f[tot][i]; cout<<ans<<endl; }
相关文章推荐
- [BZOJ 1026] SCOI 2009 windy数 · 动态规划
- BZOJ 1025: [SCOI2009]游戏|动态规划
- BZOJ 1025 SCOI2009 游戏 动态规划
- BZOJ 1025 SCOI2009 游戏 动态规划
- 1025: [SCOI2009]游戏 - BZOJ
- 游戏【SCOI2009】【BZOJ1025】递推
- 【BZOJ 1025】 [SCOI2009]游戏
- [BZOJ 1293] SCOI 2009 生日礼物 · 单调队列
- BZOJ 1025 [SCOI2009]游戏
- BZOJ1025[SCOI2009]游戏
- bzoj 1025: [SCOI2009]游戏
- bzoj 1025 [SCOI2009]游戏(置换群,DP)
- BZOJ 1025: [SCOI2009]游戏
- BZOJ 1025: [SCOI2009]游戏
- [BZOJ1025]SCOI2009游戏|置换的循环|DP
- [BZOJ 1072] SCOI 2007 排列perm · 动态规划
- [BZOJ1025] [SCOI2009]游戏 解题报告
- 【bzoj1025】【SCOI2009】【游戏】【dp】
- bzoj 1025 [SCOI2009] 游戏 题解
- 【BZOJ】1025: [SCOI2009]游戏(置换群+dp+特殊的技巧+lcm)