思想
先往一个set里面放入n个数,然后再从2开始往后枚举偶数,看枚举的偶数是否在set里出现过,没出现过就往set里放,一共放k次,放完之后对set求个和输出即可。
code
这是我刚开始写的,只能过1个样例:
#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
set<int>a;
int main()
{
int n, k; cin >> n >> k;
for (int i = 0; i < n; i++)
{
int x; cin >> x;
a.insert(x);
}
int cnt = 0;int i = 2;
while (1)
{
if (!a.count(i))
{
a.insert(i);
cnt++;
if (cnt >= k)break;
}
i += 2;
}
int sum = 0;
for (auto it = a.begin(); it != a.end(); it++)
{
sum += *it;
}
cout << sum%MOD;
return 0;
}
这里多处取模就全部过了:
#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
set<int>a;
int sum;
int main()
{
int n, k; cin >> n >> k;
for (int i = 0; i < n; i++)
{
int x; cin >> x;
sum+=x;
sum%=MOD;
a.insert(x);
}
int cnt = 0;int i = 2;
while (1)
{
if (!a.count(i))
{
a.insert(i);
sum+=i;
sum%=MOD;
cnt++;
if (cnt >= k)break;
}
i += 2;
}
cout << sum%MOD;
return 0;
}
当然只在结尾处取模也能过,但为了保险起见,还是多除取模比较好,可以防止过程中溢出:
#include <bits/stdc++.h>
using namespace std;
#define MOD 1000000007
#define int long long
set<int>s;
int sum;
signed main() {
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
s.insert(x);
sum = sum + x ;
}
int cnt = 0, i = 2;
while (1) {
if (!s.count(i)) {
sum = sum + i ;
s.insert(i);
cnt++;
if (cnt == k)
break;
}
i += 2;
}
cout << sum % MOD << endl;
return 0;
}
最后要说一点就是每个元素最大都是1e9,代码中有相加情况,要开long long,不然只能过70%。