bzoj 2818 尤拉函式

2021-10-07 12:09:26 字數 1767 閱讀 1237

思路:就是對於某個數q,跟他互質的數p,kp和kq的最大公約數是k,那麼這個數能組成的答案的數量就是phi[i]乘以某個質數,且乘積小於n

基於這種思路寫下這個**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define imax 2147483646

#define linf 0x3f3f3f3f3f3f3f3f

#define ll long long

#define ull unsigned long long

#define uint unsigned int

using

namespace std;

const

int maxn =

1e7+10;

int n;

int phi[maxn]

, v[maxn]

, pre[maxn]

,m;void

euler

(int n)

void

prime

(int n)}}

intmain()

但是這樣複雜度是o(lgn*n),超時,

使用基於線性方法去求尤拉函式,進一步可以寫出這樣的**。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define imax 2147483646

#define linf 0x3f3f3f3f3f3f3f3f

#define ll long long

#define ull unsigned long long

#define uint unsigned int

using

namespace std;

const

int maxn =

1e7+10;

ll phi[maxn]

;int v[maxn]

, pre[maxn]

, m;

int n;

intmain()

for(

int j =

1; j <= m; j++

) phi[i]

+= phi[i -1]

;//phi表示前i個尤拉函式的和

} ll ans =0;

for(

int i =

1; i <= m; i++

) ans +

= phi[n / pre[i]];

printf

("%lld\n"

, ans *

2- m)

;return0;

}

bzoj4173(尤拉函式)

資料大 10 15次方 公式複雜 不知道怎麼化簡 然後,感覺滿足打表找規律,發現sigema phi k k屬於s n,m n m。再求兩個phi就好,注意在括號裡面mod之後,需要在括號外面再mod一次,否則會wa。標準證明 總結1 很多的問題,通過小範圍資料打表,是非常便於幫助分析題目的性質的,...

BZOJ 4802 尤拉函式

已知n,求phi n 正整數n。n 10 18 輸出phi n 84 很明顯,這樣的題就是一道十分簡單的入門題。只是n比較大,但輸入和輸出都還沒有爆long long。如果輸入高精度數,那 就很噁心了 雖然可以定義大整數類big int phi n n 1 1 p 所以是miller rabin和p...

尤拉函式 尤拉定理

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