题意
定义 φ(x) = 小于 x 且与 x 互质的整数的个数。题目给出 n 个整数, 每个整数表示一个 φ(x),求 n 个 x 之和的最小值。
思路
φ(x) 实际上就是欧拉函数,欧拉函数的通项公式为:
但是,实际上,AC这个题并不需要用到欧拉函数。
对于给定的 φ(x) ,最小的 x 就是大于 φ(x) 的最小质数。所以,这个题只需要求一个素数筛然后二分查找就可以了。
题目链接
Vjudge链接
https://vjudge.net/contest/169048#problem/A
AC代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e6 + 10000;
int Cas, N;
LL prime[maxn], len;
void get_prime(int n)
{
for(LL i= 2; i<= n; i++)
{
if(prime[i] == 0) prime[len ++] = i;
for(int j= 0; j< len && i * prime[j]<= n; j++)
{
prime[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
}
int main()
{
get_prime(1e6 + 1000);
scanf("%d", &Cas);
for(int cas= 1; cas <= Cas; cas ++)
{
LL res = 0;
scanf("%d", &N);
while(N --)
{
int x;
scanf("%d", &x);
res += *upper_bound(prime, prime + len, x);
}
printf("Case %d: %lld Xukha\n", cas, res);
}
return 0;
}