51Nod 1239 尤拉函式之和

2021-08-07 02:04:04 字數 1738 閱讀 3757

s(

n)=∑

i=1n

φ(i)

φ(n) 是尤拉函式

給定n,求s(

n)mod109+

7(2≤

n≤1010)

這是我學杜教篩做的第二個題,第乙個就是和這個非常相似的求莫比烏斯函式之和

給大家推薦唐老師的一篇文章,個人感覺講的非常好,我就是在這裡學的

尤拉函式的乙個性質是這樣的n=

∑d|n

φ(d)

所以就有n×

(n+1

)2=∑

i=1n

i=∑i

=1n∑

d|iφ

(d)=

∑i=1

n∑d=

1⌊ni

⌋φ(d

)=∑i

=1ns

(⌊ni

⌋)(1)(2)

這樣就得到了s(

n)=n

×(n+

1)2−

∑i=2

ns(⌊

ni⌋)

感覺上面式子中最難理解的地方就是(1

)→(2

) 的過程了,這裡稍微解釋一下:

可以這樣理解 ∑i

=1n∑

d|iφ

(d)=

∑i=1

n∑d|

iφ(i

d)=∑

i=1n

∑j=1

⌊ni⌋

φ(j)

第二個式子中的

i 理解為列舉每乙個數,最後乙個式子中的

i 理解為列舉每乙個因子對於s

(n)=

n×(n

+1)2

−∑i=

2ns(

⌊ni⌋

) 然後就可以遞迴求解了,順便加記憶化,順便加上分段優化來求了

然後再說一下遞迴過程中記憶化的時候用的什麼資料結構

可以看一下我的另一篇文章裡面說的傳送門

這個題用三種結構都能過,而且時間差不多

具體**如下:

result:accepted

memory:26108 kb

time :1406 ms

#include

const

int maxn = 4641590;//maxn = n^(2/3)

const

int mod = 1e9+7;

using

namespace

std;

typedef

long

long ll;

const

int hash_mod=987654;

int phi[maxn];

bool vis[maxn];

int p[maxn];

ll n;

unordered_map

mp;void euler_init()

for(int j=1;p[j]*i1;

if(i%p[j]==0)

phi[p[j]*i]=phi[i]*(p[j]-1)%mod;}}

for(int i=1;i1])%mod;

}ll mod_mul(ll x,ll n)

return res;

}ll calc(ll x)

return mp[x] = ans;

}int main()

51nod1239 尤拉函式之和

求 i 1n i n 10 10 這道題和莫比烏斯函式一行,都可以通過神奇的推導的出結論。我們設 n i 1n i 眾所周知,d n d n 那麼,n n d n,d d 於是 n i 1n i d i,d d n n n 1 2 i 2n d i d d n n n 1 2 i d 2n d 1 ...

51nod 1239 尤拉函式之和

求 n i 1 i 1 n 10 杜教篩第二道裸題。必要結論 i n i n 證明 設f n i n i 將n分解質因數,n p qii 利用莫比烏斯函式裡學到的乙個性質,可以得到 f n f pq ii f pq qk 0 pk q k 1p k pk 1 1 p q f n n 設s n n i...

51Nod 1239 尤拉函式之和

acm模版 這個題和那個 51nod 1244 莫比烏斯函式之和 的方法幾乎一模一樣,差別就是推導公式的結果不一樣罷了,但是形式是一樣的。推導如下 設 f n i 1 n i 通過尤拉函式的性質我們可以知道 d n d n 所以呢,n n d n,d d f n i 1n i d i,d d f n...