每个竹子的score是竹子高度的欧拉函数值 要求每个学生的lucky值要大于score 并且所有竹子之和最小。
欧拉函数:f(x) x与小于x的数互质的数的个数。 所以每个质数,的欧拉值为x-1
所以对于每一个lucky值,我们找大于等于lucky+1的质数就是答案,因为如果不找质数的话,这个数的欧拉值要大于等于lucky值一定要大于lucky+1的那个数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e6+100;
bool isprime[maxn];
int prime[maxn];
int pcnt=0;
int lucky[10050];
void init()
{
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1];
for(int i=2;i<maxn;i++)
{
if(isprime[i])
{
prime[pcnt++]=i;
for(int j=i;j<maxn;j+=i)
{
isprime[j]=0;
}
}
}
//for(int i=0;i<15;i++) cout<<prime[i]<<endl;
}
int main()
{
init();
int t;
scanf("%d",&t);
int cnt=1;
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&lucky[i]);
ll ans=0;
for(int i=1;i<=n;i++)
{
int temp=lucky[i];
int pos=lower_bound(prime,prime+pcnt,temp+1)-prime;
ans+=prime[pos];
}
printf("Case %d: %lld Xukha\n",cnt++,ans);
}
}