Wrong answer of URAL 1807
2014-01-28 13:31
288 查看
I don't know why TLE...
# include <iostream> # include <cstdio> # include <cstring> # include <vector> # include <cmath> # define EPS 1e-8 using namespace std; vector<int> prime; const int MAXN = 40000; bool p[MAXN+2]; void init() { memset(p, true, sizeof(p)); p[0] = p[1] = false; for(int i=2; i<MAXN; i++) { if(p[i]) prime.push_back(i); for(int j=0; j<prime.size() && prime[j]*i<MAXN; j++) { p[i * prime[j]] = false; if(i % prime[j]==0) break; } } } double f[152][MAXN+2]; int pre[152][MAXN+2]; void dp(int n) { for(int j=0; j<=n; j++) f[0][j] = 0; for(int i=1; i<=150; i++) { int p = prime[i-1]; for(int j=0; j<=n; j++) f[i][j] = f[i-1][j], pre[i][j] =j; for(int k = p; k<=n; k*=p) for(int j=k; j<=n; j++) if(f[i-1][j-k] + log(k) + EPS> f[i][j]) { f[i][j] = f[i-1][j-k] + log(k); pre[i][j] = j-k; } } } int getdivisor(int n) { for(int i=0; i<prime.size(); i++) if(n % prime[i] == 0) return n / prime[i]; return 1; } int main() { init(); int n; scanf("%d", &n); int d = getdivisor(n); dp(n = n/d); if(n == 2) printf("%d %d\n",d,d); else if(n == 3) printf("%d %d\n",d,2*d); else { bool flag = false; for(int i=150,k=n; i>=0; k=pre[i][k],i--) if(k - pre[i][k]) { if (!flag) flag = true; else putchar(' '); printf("%d",d * (k-pre[i][k])); } puts(""); } return 0; }
相关文章推荐
- 史上最全的Web性能测试工具大全(上)
- ORACLE空间管理实验8:数据块格式分析--DUMP结合BBED
- 1029. Median (25)
- 一个简单的音乐贺卡
- ORACLE空间管理实验7:块管理之MMSM--为什么SYSTEM/UNDO/TEMP是MMSM管理?
- c for循环嵌套switch的用法
- 黑马程序员--命名空间和索引器小结
- 硬盘IO,SAS,SATA,和HD TUNE
- 数组中只出现一次的数字
- jQuery实现复选框的全选和反选:
- 用Excel打开csv文件时,如何处理数字内容展现会自动转换格式的问题
- [LeetCode] - Interleaving String
- Double 浮点小数相加减乘除
- CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡
- 各种数据库连接
- 第四章 禅坐和外相的修行
- 2013年度工作学习总结报告
- VBX 如何使虚拟机支持多核
- 预编译的作用
- 踢猫效应的故事