LightOJ

来源:互联网 发布:视频会议软件哪个好 编辑:程序博客网 时间:2024/06/10 03:13

题目链接:https://cn.vjudge.net/problem/LightOJ-1370

题意:给出n个数的欧拉值,求这n个数的和的最小值。


欧拉函数:数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。

性质:

欧拉函数是积性函数——若m,n互质,
 
特殊性质:当n为奇数时,
  
, 证明与上述类似。
若n为质数则
 

相邻两个素数之间合数的欧拉值都小于较小素数的欧拉值。不会证明。。。

所以只要找到大于并且最接近这个数的素数就好了。

代码:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define MAX_N 2000000int prime[MAX_N/2];bool is_prime[MAX_N+1];void sieve(int n){    int p = 0;    memset(is_prime,true,sizeof(is_prime));    is_prime[0] = is_prime[1] = false;    for(int i = 2; i <= n/2; i++)    {        if(is_prime[i])            prime[p++] = i;        for(int j=0; j<p && prime[j]*i<=n; j++)        {            is_prime[prime[j]*i]=false;            if(i%prime[j]==0)                break;        }    }}int main(){    int t;    sieve(MAX_N);    scanf("%d",&t);    for(int tt=1;tt<=t;tt++)    {        int n;        scanf("%d",&n);        long long sum=0;        while(n--)        {            int x;            scanf("%d",&x);            for(int i=x+1;;i++)            {                if(is_prime[i])                {                    sum+=i;                    break;                }            }        }        printf("Case %d: %lld Xukha\n",tt,sum);    }    return 0;}


原创粉丝点击