題意:
題意:題意
: 小 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...