lightoj 1370 欧拉函数
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\n",++Case,ans); } return 0; }