lightoj 1370 欧拉函数

A - Bi-shoe and Phi-shoe
Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu
Appoint description: 

Description

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 n which 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

题意:

 Φ (n)表示长度为小于数字n的和n互质的数的个数,也就是欧拉函数。现在给出n个幸运数字,对于每一个幸运数字,要求的x,使Φ (n)的值大于等于这个幸运数字,求这些x和的最小值。

思路:

先打表,对输入的n个数排序,然后枚举。

/*
 * Author:  sweat123
 * Created Time:  2016/7/11 13:55:52
 * File Name: main.cpp
 */
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<string>
#include<vector>
#include<cstdio>
#include<time.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 1<<30
#define MOD 1000000007
#define ll long long
#define lson l,m,rt<<1
#define key_value ch[ch[root][1]][0]
#define rson m+1,r,rt<<1|1
#define pi acos(-1.0)
using namespace std;
const int MAXN = 2000010;
int er[MAXN],notprime[MAXN],cnt,n;
int prime[MAXN];
struct node{
    int id,val;
    friend bool operator <(node fa,node fb){
        if(fa.val != fb.val)return fa.val > fb.val;
        return fa.id > fb.id;
    }    
};
int num;
void init(){
    cnt = 0;
    memset(er,0,sizeof(er));
    memset(notprime,0,sizeof(notprime));
    for(int i = 2; i <= MAXN - 10; i++){
        if(!notprime[i]){
            er[i] = i - 1;
            prime[cnt++] = i;
        } 
        for(int j = 0; j < cnt && 1LL * prime[j] * i <= MAXN; j++){
            notprime[i * prime[j]] = 1;
            if(i % prime[j] == 0){
                er[i * prime[j]] = er[i] * prime[j];break; 
            } else {
                er[i * prime[j]] = er[i] * (prime[j] - 1);   
            }
        }
    } 
}
int a[1000010];
int main(){
    init();
    int t,Case = 0;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i = 1; i <= n; i++){
            scanf("%d",&a[i]);   
        }
        sort(a+1,a+n+1);
        ll ans = 0;
        int x = 2;
        for(int i = 1; i <= n; i++){
            while(er[x] < a[i]){
                x += 1;   
            }
            ans += x;
        }
        printf("Case %d: %lld Xukha
",++Case,ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/sweat123/p/5660146.html