結果
| 問題 |
No.458 異なる素数の和
|
| コンテスト | |
| ユーザー |
kichirb3
|
| 提出日時 | 2018-03-31 13:22:47 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 148 ms / 2,000 ms |
| コード長 | 2,115 bytes |
| コンパイル時間 | 861 ms |
| コンパイル使用メモリ | 83,752 KB |
| 実行使用メモリ | 180,240 KB |
| 最終ジャッジ日時 | 2024-06-26 01:21:26 |
| 合計ジャッジ時間 | 2,939 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
// No.458 異なる素数の和
// https://yukicoder.me/problems/no/458
//
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <chrono>
using namespace std;
vector<bool> create_prime_list(unsigned int limit);
int solve(unsigned int n, vector<int> &primes);
vector<bool> create_prime_list(unsigned int limit) {
// エラトステネスの篩
vector<bool> isprime(limit+1, true);
isprime[0] = false;
isprime[1] = false;
for (auto i = 2; i <= sqrt(limit); ++i) {
if (isprime[i]) {
int j = i + i;
while (j <= limit) {
isprime[j] = false;
j += i;
}
}
}
return isprime;
}
int dp[3000][20001];
int main() {
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
unsigned int n;
cin >> n;
// chrono::system_clock::time_point s = chrono::system_clock::now();
// 素数リストの作成
vector<bool> res = create_prime_list(n);
vector<int> primes;
for (auto i = 2; i < res.size(); ++i) {
if (res[i])
primes.push_back(i);
}
int ans = solve(n, primes);
cout << ans << endl;
// chrono::system_clock::time_point t = chrono::system_clock::now();
// chrono::milliseconds mss = chrono::duration_cast<chrono::milliseconds> (s.time_since_epoch());
// chrono::milliseconds mst = chrono::duration_cast<chrono::milliseconds> (t.time_since_epoch());
// cout << mst.count() - mss.count() << endl;
}
int solve(unsigned int n, vector<int> &primes) {
//vector<vector<int>> dp;
//for (int y = 0; y <= primes.size(); ++y) {
//vector<int> t(n+1, -1);
// dp.push_back(t);
//}
//dp[0][0] = 0;
dp[0][0] = 1;
for (int y = 1; y <= primes.size(); ++y) {
int p = primes[y-1];
for (int x = 0; x <= n; ++x) {
if (x >= primes[y-1] && dp[y-1][x-primes[y-1]] >= 1)
dp[y][x] = max(dp[y-1][x-primes[y-1]]+1, dp[y-1][x]);
else
dp[y][x] = dp[y-1][x];
}
}
return dp[primes.size()][n] - 1;
}
kichirb3