light oj 1370 尤拉函式題)

2021-09-25 12:30:45 字數 1039 閱讀 2381

這是題目鏈結供大家練習用:

先介紹一下尤拉函式:

尤拉函式

定義:φ(n) 表示小於等於n的數中與n互質的數的個數。

基本性質:

① φ(1)=1 (很顯然)

②對於φ(n),如果n是質數,φ(n) = n - 1。 (也很顯然)

③對於φ(n),如果n是質數p的k次方(即n=p^k),對於φ(n) = p^k - p(k-1)。想了半天終於想懂為什麼了。n是質數p的k次方,那麼除了p的倍數其他的數都跟n互質,p的倍數有多少個呢。自然是n/p個了(相當於15裡面有15/3個3的倍數),n/p就是p(k-1)。

④若n.m互質,φ(nm) = φ(n) * φ(m)。

⑤ 當n為奇數時,φ(2*n)=φ(n)。

⑥當n是質數時,φ(n * 2) = φ(n) * φ(2) = φ(n)。

⑦小於n且與n互質的所有數的和是φ(n)*n/2。

分析這個題目大致意思就是:

給出一些數字,對於每個數字找到乙個尤拉函式值大於等於這個數的數,求找到的所有數的最小和。

思路:1.用陣列存下每個數的尤拉函式值,然後乙個個找。

2.利用尤拉函式的性質。對於給定的數x,尤拉函式值大於等於x的數一定大於x,於是我們從x+1開始找,看他之後的每乙個數是不是素數,如果是的話,就break。為什麼呢,因為縱觀剛剛的那些性質我們發現,素數的尤拉函式值最大。所以我們碰到的第乙個素數一定是我們要找的數。(意思就是因為有素數的性質得素數的尤拉值最大且為p-1,所以第乙個達到要求的值一定為素數。

再次直接附上ac**:

#include#include#include#include#define inf 1000000000

using namespace std;

const int n= 1e6 + 5;

bool no_prime[n];

void init()

}}int main()}}

printf("case %d: %lld xukha\n",case++,sum);

}}

尤拉函式 尤拉定理

尤拉函式 對正整數 n,尤拉函式 是小於等於 n的數中與 n互質的數的數目 此函式以其首名研究者尤拉命名 euler so totientfunction 它又稱為 euler stotient function 函式 尤拉商數等。例如 8 4,因為 1,3,5,7均和8 互質。注 n為1時尤拉函式...

尤拉函式 尤拉定理

尤拉函式 設 n 為正整數,則 1,2,n 中與 n 互素的整數的個數計作 n 叫做尤拉函式。設 p 是素數,p p 1設 p 是素數,pa pa p a 1 設 p,q 是不同的素數,n q p,n p q 即 n p 1 q 1 設 m,n 是兩個正整數,且 m,n 1,若 n m n,n m ...

尤拉函式尤拉篩

尤拉函式求小於等於n與n互質的數的個數 複習時發現這個知識點竟然沒有整理 n為素數即為n 1 除了其本身 n為素數的倍數 ola sushu j i ola i sushu j else ola sushu j i ola i sushu j 1 include include include in...