尤拉函式之和
做法:這題需要用到杜教篩+雜湊表。這一題和51nod1244(我寫的題解)都是杜教篩的模板題。 設f
(n)=
∑ni=
1φ(i
),利用∑d
|nφ(
d)=n
這一性質來推導式子,我們來求函式i(
n)=n
的字首和,顯然∑n
i=1i
(i)=
n(n+
1)2,那麼∑n
i=1∑
d|iφ
(d)=
n(n+
1)2,所以: ∑i
=1n∑
d=1⌊
ni⌋φ
(d)=
∑i=1
nf(⌊
ni⌋)
=n(n
+1)2
將f(n
)一項提出來,得: f(
n)=n
(n+1
)2−∑
i=2n
f(⌊n
i⌋)遞迴+分塊計算+雜湊表判重+預處理106
以內的f
即可通過此題。注意,做乘法時兩邊數值可能較大,需要先對109
+7取模再相乘。
以下是本人**:
簡單直接的除數取餘雜湊(ac):
#include
#include
#include
#include
#include
#define ll long long
#define limit 1000000
#define size 7500000
#define smod 7500000
#define mod 1000000007
using
namespace
std;
ll n,h[size+5]=,f[size+5];
int phi[limit+5],sum[limit+5],tot=0;
bool prime[limit+5]=;
int hash(ll x)
void calc_phi(ll x)
}sum[0]=0;
for(int i=1;i<=x;i++) sum[i]=(sum[i-1]+phi[i])%mod;
}ll mult(ll a,ll b,ll c)
ll count(ll x)
h[pos]=x,f[pos]=((mult(x,x+1,2)-s)%mod+mod)%mod;
return f[pos];
}int main()
類似鄰接表布局的除數取餘雜湊(tle,13/25):
所以就不應該亂想什麼詭異的技巧……
#include
#include
#include
#include
#include
#define ll long long
#define limit 1000000
#define size 5000000
#define smod 5000000
#define mod 1000000007
using
namespace
std;
ll n,h[size+5]=,f[size+5];
int phi[limit+5],sum[limit+5],tot=0,first[size+5]=,next[size+5];
bool prime[limit+5]=;
int hash(ll x)
void calc_phi(ll x)
}sum[0]=0;
for(int i=1;i<=x;i++) sum[i]=(sum[i-1]+phi[i])%mod;
}ll mult(ll a,ll b,ll c)
ll count(ll x)
h[pos]=x,f[pos]=((mult(x,x+1,2)-s)%mod+mod)%mod;
return f[pos];
}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...