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...