1. 程式人生 > >Bi-shoe and Phi-shoe LightOJ - 1370

Bi-shoe and Phi-shoe LightOJ - 1370

題意:給一些數Ai(第 i 個數),Ai代表的是某個數尤拉函式的值,我們要求出數 Ni 的尤拉函式值不小於Ai。而我們要求的就是這些 Ni 這些數字的和sum,而且我們想要sum最小,求出sum最小多少。
思路: 要求和最小,我們可以讓每個數都儘量小,那麼我們最後得到的肯定就是一個最小值。給定一個數的尤拉函式值ψ(N),我們怎麼樣才能求得最小的N?我們知道,一個素數P的尤拉函式值ψ(P)=P-1。所以如果我們知道ψ(N),那麼最小的N就是最接近ψ(N),並且大於ψ(N)的素數。我們把所有素數打表之後再判斷就可以了。
AC程式碼:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e6+10;
typedef long long ll;
int book[maxn];
void init()
{
    memset(book,0,sizeof(book));
    for(int i = 2; i <= maxn; i++)
    {
        if(book[i]==0)
            for(int j = i+i; j <= maxn; j += i)
                book[j] = 1;
    }
}
int main(void)
{
    init();
    int t;
    scanf("%d",&t);
    for(int i = 1; i <= t; i++)
    {
        int n;
        cin>>n;
        ll sum = 0;
        while(n--)
        {
            int x;
            cin>>x;
            for(int i = x+1; ; i++)
            {
                if(book[i]==0)
                {
                    sum += i;
                    break;
                }
            }
        }
        printf("Case %d: %lld Xukha\n",i,sum);
    }
    return 0;
}