题意
给出一些数字,对于每个数字找到一个欧拉函数值大于等于这个数的数,求找到的所有数的最小和。
思路
欧拉函数:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。 性质:对于质数p,φ(p) = p - 1。注意φ(1)=1.
解题点:只需要从x+1(x是幸运数字)开始,找第一个出现的素数,这就是这个幸运数字的欧拉函数值。
再将这一串幸运的欧拉函数值累加起来即可
//用普通的判断质数的方法超时了,优化后因为是超时。。应该用打表的方法 //通过质数的判断来计算欧拉函数值。除1之外φ(p) = p - 1
样例
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
AC代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e7+5;
bool prime[N];
//打表。先求出来质数集合
void is_prime()
{
prime[1]=false;
for(int i=2;i<N;i++)
{
prime[i]=true;
}
for(int i=2;i*i<N;i++)
{
if(prime[i])
{
for(int j=i*i;j<=N;j+=i)
{
prime[j]=false;
}
}
}
}
int main()
{
int t,n,count=0;
is_prime();
cin>>t;
while(t--)
{
long long sum=0;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x; //原本是输入到一个数组里,后开发现没必要,反而浪费了空间
for(int j=x+1; ; j++) //从j+1开始
{
if(prime[j]) //如果j原来为1(即a[i]的值),就已经知道了他的欧拉值为1,不用再带入函数去计算
{
sum+=j;
break;
}
}
}
cout<<"Case "<<++count<<": "<<sum<<" Xukha"<<endl;
}
return 0;
}
题源:lightoj.com/login_main.…