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)=n∗
(n+1
)2−∑
i=2n
∑d|i
,d(d)
f(n)
=n∗(
n+1)
2−∑i
=2n∑
d=1⌊
ni⌋φ
(d)
f(n)
=n∗(
n+1)
2−∑i
=2nf
(⌊ni
⌋)公式的形式和 莫比
烏斯函式
之和的款式是一樣的,所以求解方法也是一樣的,依然是分塊兒和記憶化等操作。
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
const
int mod1 = 1e9 + 7;
const
int mod2 = 2333333;
const
int inv_2 = 5e8 + 4;
const
int maxn = 5e6 + 10;
ll n;
int tot;
ll tep[mod2];
ll val[mod2];
int phi[maxn + 5];
int prime[maxn + 5];
int hed[mod2];
int net[mod2];
bool vis[maxn + 5];
void add(int x, ll y, ll z)
ll cal(ll x)
int k = x % mod2;
ll ret = 0, z = x % mod1;
for (int i = hed[k]; i; i = net[i])
}for (ll l = 2, r; l <= x; l = r + 1)
ret = (z * (z + 1) % mod1 * inv_2 % mod1 - ret + mod1) % mod1;
add(k, x, ret);
return ret;
}void init()
for (int j = 1; j <= prime[0]; j++)
vis[k] = 1;
if (!(i % prime[j]))
phi[k] = phi[i] * (prime[j] - 1);}}
phi[1] = 1;
for (int i = 1; i <= maxn; i++)
}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 尤拉函式之和
s n i 1n i n 是尤拉函式 給定n,求s n mod109 7 2 n 1010 這是我學杜教篩做的第二個題,第乙個就是和這個非常相似的求莫比烏斯函式之和 給大家推薦唐老師的一篇文章,個人感覺講的非常好,我就是在這裡學的 尤拉函式的乙個性質是這樣的n d n d 所以就有n n 1 2 i...