题意:
组数据,给定长度为
的序列
,对于每个
求出
的最小
。
题解:
对于每个数
,一定是找到最小的欧拉函数大于等于
的质数。
对于一个数
,我们要证明任意
,
当且仅当
时。(不会证)
暴力枚举每个数即可,
内的最大两个素数间隔为
。
注意:本题中
时的
。
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
const int maxn = 1000010;
int q[N], n;
int pri[maxn], cnt;
bool st[maxn];
void xs(int n) {
st[0] = st[1] = true;
for(int i = 2; i <= n; ++i) {
if(!st[i]) pri[++cnt] = i;
for(int j = 1; j <= cnt && 1ll * i * pri[j] <= n; ++j) {
st[i * pri[j]] = true;
if(i % pri[j] == 0) break;
}
}
}
int b_s(int x) {
int l = 1, r = cnt;
while(l < r) {
int mid = l + r >> 1;
if(pri[mid] - 1 >= x) r = mid;
else l = mid + 1;
}
return l;
}
long long solve() {
scanf("%d", &n);
long long res = 0;
for(int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
if(x == 1) res += 2;
else {
int t = b_s(x);
res += pri[t];
}
}
return res;
}
int main()
{
xs(maxn - 1);
int T = 1; scanf("%d", &T);
for(int i = 1; i <= T; ++i) {
printf("Case %d: %lld Xukha\n", i, solve());
}
return 0;
}