結果
問題 | No.385 カップ麺生活 |
ユーザー |
![]() |
提出日時 | 2019-02-28 16:39:51 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 1,620 bytes |
コンパイル時間 | 1,627 ms |
コンパイル使用メモリ | 183,780 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-04 22:59:34 |
合計ジャッジ時間 | 2,487 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 32 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define int long longstruct Prime{vector<int> prime; // 2,3,5,7,11...vector<bool> is_prime; // 素数=1,合成数=0void eratos(int n){is_prime.resize(n+1,true);is_prime[0] = is_prime[1] = false;for(int i = 2; i <= n; i++){if(is_prime[i]){prime.push_back(i);for(int j = i*2; j <= n; j+=i){is_prime[j] = false;}}}}//因数分解map<int,int> prime_factor(int n){map<int,int> mp; //{約数,個数}for(int i = 2; i*i <= n; i++){while(n%i == 0){mp[i]++;n /= i;}}if(n != 1) mp[n] = 1; //n=素数return mp;}//mpから作れる、約数をちょうどn個もつ数の個数int factor_cnt(map<int,int> mp,int n){vector<int> dp(n+2); //約数がちょうどi個の数の個数dp[1] = 1;for(auto p : mp) {for(int i = n; i > 0; i--) {for(int j = p.second; j > 0; j--) {dp[ min(n+1,i*(j+1)) ] += dp[i];}}}return dp[n];}}prime;signed main(){cin.tie(0);ios::sync_with_stdio(false);int m,n; cin >> m >> n;vector<int> c(n);for(int i = 0; i < n; i++){cin >> c[i];}sort(c.begin(),c.end());vector<int> dp(m+1,0);for(int i = 0; i < n; i++){for(int j = m; j > 0; j--){if(j-c[i] < 0) continue;if(dp[j] || j == m){dp[j-c[i]] = max(dp[j-c[i]],dp[j]+1);}}}prime.eratos(m);int ans = 0;for(int i : prime.prime){ans += dp[i];}cout << ans + m/c[0] << endl;return 0;}