lightoj1370欧拉函数性质应用

Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popular coach for his success. He needs some bamboos for his students, so he asked his assistant Bi-Shoe to go to the market and buy them. Plenty of Bamboos of all possible integer lengths (yes!) are available in the market. According to Xzhila tradition,

Score of a bamboo = Φ (bamboo's length)

(Xzhilans are really fond of number theory). For your information, Φ (n) = numbers less than nwhich are relatively prime (having no common divisor other than 1) to n. So, score of a bamboo of length 9 is 6 as 1, 2, 4, 5, 7, 8 are relatively prime to 9.

The assistant Bi-shoe has to buy one bamboo for each student. As a twist, each pole-vault student of Phi-shoe has a lucky number. Bi-shoe wants to buy bamboos such that each of them gets a bamboo with a score greater than or equal to his/her lucky number. Bi-shoe wants to minimize the total amount of money spent for buying the bamboos. One unit of bamboo costs 1 Xukha. Help him.

Input

Input starts with an integer T (≤ 100), denoting the number of test cases.

Each case starts with a line containing an integer n (1 ≤ n ≤ 10000) denoting the number of students of Phi-shoe. The next line contains n space separated integers denoting the lucky numbers for the students. Each lucky number will lie in the range [1, 106].

Output

For each case, print the case number and the minimum possible money spent for buying the bamboos. See the samples for details.

Sample Input

3

5

1 2 3 4 5

6

10 11 12 13 14 15

2

1 1

Sample Output

Case 1: 22 Xukha

Case 2: 88 Xukha

Case 3: 4 Xukha

素数的欧拉函数值即为p-1,所以就是找答案即为找距离x+1最近的素数 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000005
#define ll long long
using namespace std;
int p[maxn];
int vis[maxn];
int a[maxn];
int cnt;
int t;
int n;
void init()
{cnt=0;
memset(vis,0,sizeof(vis));
memset(p,0,sizeof(p));
vis[0]=vis[1]=1;
for(int i=2;i<maxn;i++)
{
   if(!vis[i])
    p[cnt++]=i;
   for(int j=0;j<cnt&&i*p[j]<maxn;j++)
   {
       vis[i*p[j]]=1;
       if(i%p[j]==0)
        break;
   }

}
}


int main()
{init();
scanf("%d",&t);
int w=0;
while(t--)
{w++;
    scanf("%d",&n);
    int x;
    ll sum=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        for(int j=x+1;;j++)
        {
            if(!vis[j])
            {
                sum+=j;
                break;
            }
        }
    }

    printf("Case %d: %lld Xukha\n",w,sum);

}
return 0;

}

猜你喜欢

转载自blog.csdn.net/sdauguanweihong/article/details/89792034