欧拉函数:小于等于n的数中与n互质的个数。
打表模板:
void ol() {
for(int i=2; i<N; i++) {
if(!a[i]) {
for(int j=i; j<N; j+=i) {
if(!a[j])a[j]=j;
a[j]=a[j]/i*(i-1);
}
}
}
}
给定一个数x,找到某个最小的数的欧拉函数值大于等于x即可,最后累加即为答案。
#include<iostream>
#include<cmath>
#include<algorithm>
const int N=1e6+10;
using namespace std;
int a[N];
void ol() {
for(int i=2; i<N; i++) {
if(!a[i])
for(int j=i; j<N; j+=i) {
if(!a[j])a[j]=j;
a[j]=a[j]/i*(i-1);
}
}
}
int main() {
ol();
int t;
cin>>t;
int cc=1;
while(t--) {
int n;
cin>>n;
long long sum=0;
while(n--) {
int x;
cin>>x;
int c=x;
while(a[x]<c)x++;
sum+=x;
}
printf("Case %d: %lld Xukha\n",cc++,sum);
}
}
给出n个数字的序列a[],对于每个数字ai找到一个欧拉函数值大于等于ai的数bi,求找到的所有数bi的最小值之和sum(此处规定欧拉函数1的值为0)
Input
有T(T<=100)组数据,每组数据有两行,第一行给定n(n<=10000) 第二行给出长度为n的序列a[],ai的取值范围为[1,1000000]
Output
输出一个数sum
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