diff --git a/TangDou/AcWing/RongChi/HDU2204.cpp b/TangDou/AcWing/RongChi/HDU2204_1.cpp similarity index 100% rename from TangDou/AcWing/RongChi/HDU2204.cpp rename to TangDou/AcWing/RongChi/HDU2204_1.cpp diff --git a/TangDou/AcWing/RongChi/HDU2204_2.cpp b/TangDou/AcWing/RongChi/HDU2204_2.cpp new file mode 100644 index 0000000..d9ac59b --- /dev/null +++ b/TangDou/AcWing/RongChi/HDU2204_2.cpp @@ -0,0 +1,41 @@ +#include +using namespace std; +#define ll long long +#define inf 0x3f3f3f3f +#define ll_inf 1ll << 60 +const int maxn = 100 + 100; +ll mu[maxn * 100], prim[maxn * 100], check[maxn * 100]; +int tot = 0; +void getmu() { + mu[1] = 1; + for (int i = 2; i < maxn; i++) { + if (!check[i]) { + prim[tot++] = i; + mu[i] = -1; + } + for (int j = 0; j < tot; j++) { + if (prim[j] > maxn / i) { + break; + } + check[i * prim[j]] = 1; + if (i % prim[j] == 0) { + mu[i * prim[j]] = 0; + break; + } else { + mu[i * prim[j]] = -mu[i]; + } + } + } +} +int main() { + getmu(); + ll tmp; + while (cin >> tmp) { + ll sum = 1; + for (ll i = 2; i <= 64; i++) { + sum -= mu[i] * (ll)(pow(tmp * 1.0, 1.0 / i) - 1); + } + cout << sum << endl; + } + return 0; +} \ No newline at end of file diff --git a/TangDou/AcWing/Mobius/TODO.md b/TangDou/Topic/TODO.md similarity index 100% rename from TangDou/AcWing/Mobius/TODO.md rename to TangDou/Topic/TODO.md diff --git a/TangDou/AcWing/Mobius/mobius.cpp b/TangDou/Topic/mobius.cpp similarity index 96% rename from TangDou/AcWing/Mobius/mobius.cpp rename to TangDou/Topic/mobius.cpp index 3ed9999..0289ae0 100644 --- a/TangDou/AcWing/Mobius/mobius.cpp +++ b/TangDou/Topic/mobius.cpp @@ -4,7 +4,7 @@ using namespace std; typedef long long LL; const int N = 1e5 + 10; -int n = 100; +int n = 27; //筛法求莫比乌斯函数(枚举约数) LL mu[N], sum[N]; diff --git a/TangDou/AcWing/Mobius/莫比乌斯函数.cpp b/TangDou/Topic/莫比乌斯函数.cpp similarity index 100% rename from TangDou/AcWing/Mobius/莫比乌斯函数.cpp rename to TangDou/Topic/莫比乌斯函数.cpp diff --git a/TangDou/AcWing/Mobius/莫比乌斯函数.md b/TangDou/Topic/莫比乌斯函数.md similarity index 65% rename from TangDou/AcWing/Mobius/莫比乌斯函数.md rename to TangDou/Topic/莫比乌斯函数.md index 4fc9c46..4eb0cc6 100644 --- a/TangDou/AcWing/Mobius/莫比乌斯函数.md +++ b/TangDou/Topic/莫比乌斯函数.md @@ -1,8 +1,12 @@ ## 莫比乌斯函数 -要学习莫比乌斯函数 需要学习 到 **积性函数**,深度理解 **欧拉筛** 。 +https://www.cnblogs.com/letlifestop/p/10262757.html -#### 一、积性函数 +// https://blog.csdn.net/qq_42887171/article/details/95237740 + +要学习莫比乌斯函数需要学习 到 **积性函数**,深度理解 **欧拉筛** 。 + +### 一、积性函数 #### 1. 定义 @@ -11,16 +15,23 @@ **完全积性函数**:对于任意正整数$a,b$,都满足$f(a*b)=f(a)*f(b)$,则称$f(x)$为 **完全积性函数** #### 2. 性质 -1.若$f(n),g(n)$均为积性函数,则函数$h(n)=f(n)*g(n)$也是积性函数 -2.若$f(n)$为积性函数,则函数$c*f(n)$($c$是常数)也是积性函数,反之一样 +1. 若$f(n),g(n)$均为积性函数,则函数$h(n)=f(n)*g(n)$也是积性函数 + +2. 若$f(n)$为积性函数,则函数$c*f(n)$($c$是常数)也是积性函数,反之一样 -3.**任何积性函数都能应用线性筛**,在$O(n)$时间内求出$1\sim n$项(**莫比乌斯函数要用到**),像素数,欧拉函数等都是 **积性函数**。 +3. **任何积性函数都能应用线性筛**,在$O(n)$时间内求出$1\sim n$项(**莫比乌斯函数要用到**),像素数,欧拉函数等都是 **积性函数**。 ### 二、莫比乌斯函数 -#### 1. 定义 +#### 1. 用途 + +我们举例一道经典的应用题,求$1$到$N$中与$a$互质的数的个数:根据容斥原理,设$S_i$为$1$到$N$中和$a$有公因子$i$的数的个数,答案为$N−S_2-S_3-S_5-S_7...+S_{2,3}+S_{3,5}+S_{2,5}...$,可以发现,其答案为$\large \displaystyle \sum_{i=1}^{N}\mu(i)*S_i$。 + +> **注**:在使用容斥原理解决计数问题时,莫比乌斯函数的值就是每一项的系数,要么是$1$,要么是$-1$。这是因为莫比乌斯函数在容斥原理中的作用就是用来表示每个子集合的权重,从而在计算中起到排除重复计数的作用。 + +#### 2. 定义 莫比乌斯函数是以$19$世纪的数学家亚当·莫比乌斯的名字命名的。它是数论中的一个重要函数,通常用符号 $μ(n)$ 表示。 @@ -32,7 +43,7 @@ * ③ $μ(n)$ 的结果取决于$n$根据 **算数基本定理** 分解的 **质因数个数的奇偶性** 来判断。比如$n=3,5,7$就只有一个质因数所以为$μ(n)=-1$,$n=6,15,21$,$μ(n)$就为$1$。 -#### 2. 求单个数字的莫比乌斯函数值 +#### 3. 求单个数字的莫比乌斯函数值 ```cpp {.line-numbers} //单个数的莫比乌斯函数 @@ -51,7 +62,7 @@ int getmob(LL x) { } ``` -#### 3.枚举倍数求莫比乌斯函数(埃氏筛) +#### 4.枚举倍数求莫比乌斯函数(埃氏筛) ```cpp {.line-numbers} //枚举倍数求莫比乌斯函数 LL mu[N] , sum[N]; @@ -64,7 +75,9 @@ void mobius(LL x) { for (LL i = 1; i <= n; i++) sum[i] = sum[i - 1] + mu[i]; } ``` -#### 4.枚举约数求莫比乌斯函数(欧拉筛) + + +#### 5.枚举约数求莫比乌斯函数(欧拉筛) **[视频讲解](https://www.bilibili.com/video/BV1Te4y1C7DP)** ```cpp {.line-numbers} @@ -93,8 +106,3 @@ void get_mobius2(LL n) { } ``` -### 三、练习题 - -我们举例一道经典的应用题,求$1$到$N$中与$a$互质的数的个数:那么根据容斥原理,设$S_i$为$1$到$N$中和$a$有公因子$i$的数的个数,答案为$N−S_2-S_3-S_5-S_7...+S_{2,3}+S_{3,5}+S_{2,5}...$,我们可以惊奇的发现,其答案为$\large \displaystyle \sum_{i=1}^{N}\mu(i)*S_i$。 - -我们可以根据线性筛质数在$O(N)$的时间内算出前$N$个数的 **莫比乌斯函数**。