您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: