結果
| 問題 |
No.2039 Copy and Avoid
|
| コンテスト | |
| ユーザー |
publfl2
|
| 提出日時 | 2022-08-12 22:49:36 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 548 ms / 2,000 ms |
| コード長 | 917 bytes |
| コンパイル時間 | 930 ms |
| コンパイル使用メモリ | 76,568 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-23 03:29:59 |
| 合計ジャッジ時間 | 4,843 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 31 |
ソースコード
#include <stdio.h>
#include <set>
#include <map>
#include <algorithm>
#include <vector>
#define MAX (long long int)2e18
std::set<int> S;
std::vector<int> V;
std::map<int,long long int> M;
int x[5010];
int main()
{
int a,b;
long long int c,d;
scanf("%d%d%lld%lld",&a,&b,&c,&d);
for(int i=1;i*i<=a;i++)
{
if(a%i==0)
{
S.insert(i);
S.insert(a/i);
}
}
for(int i=1;i<=b;i++)
{
int e;
scanf("%d",&e);
S.erase(e);
x[i] = e;
}
for(std::set<int> ::iterator it = S.begin();it!=S.end();it++) V.push_back(*it);
M[0] = 0;
for(int i=1;i<V.size();i++)
{
int s = V[i];
M[s] = MAX;
for(int j=0;j<i;j++)
{
int t = V[j];
if(s%t==0)
{
long long int val;
for(int k=1;k<=b;k++)
{
if(t<=x[k]&&x[k]<=s&&x[k]%t==0) goto u;
}
val = M[t] + (s/t - 1)*c + d;
M[s] = M[s]<val?M[s]:val;
u:;
}
}
}
if(M[a]==MAX) printf("-1");
else printf("%lld",M[a]-d);
}
publfl2