【LightOJ-1370】Bi-shoe and Phi-shoe

108 阅读1分钟
题意

给出一些数字,对于每个数字找到一个欧拉函数值大于等于这个数的数,求找到的所有数的最小和。

 

思路

欧拉函数:对于一个正整数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.…