小G的約數

2021-10-20 10:39:59 字數 1906 閱讀 8365

題意:

題意:題意

: 小 g定

義了兩個

函式f(

n)為n

的約數和

小g定義了兩個函式f(n)為n的約數和

小g定義了兩

個函式f

(n)為

n的約數

和 g (n

)=f(

1)+f

(2)+

...+

f(n−

1)+f

(n),

求g(g

(n))

.g(n)=f(1)+f(2)+...+f(n-1)+f(n),求g(g(n)).

g(n)=f

(1)+

f(2)

+...

+f(n

−1)+

f(n)

,求g(

g(n)

). 考慮分

塊,我們

只需要考

慮1...n中

每乙個因

子的貢獻

即可

考慮分塊,我們只需要考慮1...\sqrt中每乙個因子的貢獻即可

考慮分塊,我

們只需要

考慮1.

..n​

中每乙個

因子的貢

獻即可

顯 然,

對於因子

i,它在

1...n中

的個數為

n/i,

那麼它的

貢獻為n

/i∗i

顯然,對於因子i,它在1...\sqrt中的個數為n/i,那麼它的貢獻為n/i*i

顯然,對於因

子i,它

在1..

.n​中

的個數為

n/i,

那麼它的

貢獻為n

/i∗i對於

大於n的

因子,對

∑k=n

+1n/

ik求和

即可

對於大於\sqrt的因子,對\sum\limits_+1}^求和即可

對於大於n​

的因子,

對k=n

​+1∑

n/i​

k求和即

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

#define inf 0x3f3f3f3f

typedef

unsigned

long

long ull;

inline

intread()

while

(ch>=

'0'&&ch<=

'9') s=s*

10+ch-

'0',ch=

getchar()

;return s*w;

}const

int maxn =

1e6+5;

intmain()

} n=ans,ans=0;

for(ll i=

1;i<=

sqrt

(n);i++)}

printf

("%lld\n"

,ans)

;return0;

}

nowcoder 218398 小G的約數

點我跳轉 定義 f n 是 n 的約數的和,然後 g n 則是 1 f n 的和。然後問你 g g n 是多少。首先,我們會想到,暴力算是不行的。然後我們考慮優化算 g n g n g n 怎麼弄。我們先看約數有什麼特別的地方,那有約數,又有字首和,那如果對於乙個數 x xx,它會是哪些數的因子呢?...

牛客 小G的約數引起的對於 整數分塊 學習

整除分塊是個啥 要求 n 的值,這時候暴力需要o n 的時間。由於這個區間是連續的,且 是向下取整,當i不能整除k時,n i會等於最小的i 也就是區間最左邊的值 l 除n的商。此時如果可以很快的找到這乙個區間,那麼就可以將時間複雜度降到 o sqrt 接下來講一下怎麼去找這個區間 假設n 20,然後...

約數的個數和約數之和

對任意乙個數n,d是n的乙個約數,他們可以寫成下列格式 約數個數就轉化為等於每個因子有多少種選法 在int範圍內,約數最多的數有大概1500個約數。實現 先對a1,a2,an 分別分解,再套用公式 include include include using namespace std const i...