diff --git a/TangDou/AcWing/RongChi/HDU2204_1.cpp b/TangDou/AcWing/RongChi/HDU2204_1.cpp index 24c4462..3ff9a6a 100644 --- a/TangDou/AcWing/RongChi/HDU2204_1.cpp +++ b/TangDou/AcWing/RongChi/HDU2204_1.cpp @@ -5,6 +5,15 @@ using namespace std; // 60以内的质数列表 int p[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59}; +/* +具体思路:如果是求n中,为平方数的有多少个,那么答案肯定是sqrt(n),同理, +如果是三次根号的话,那么答案肯定是n的三分之一次方。然后继续按照这个思路来, +对于1e18次方的数,最多就是2的64次方,也就是说我们最多枚举大小不超过63的素数就可以了, +然后还需要考虑一种情况,比如说6的时候,被素数2算了一遍,然后又被素数3算了一遍,这个地方会有重复的计算, +又因为2^(3*5*7)已经超过2的60次方了,所以我们只需要考虑三部分就可以了。 + +执行时间:15MS +*/ signed main() { int n; while (cin >> n) { diff --git a/TangDou/AcWing/RongChi/HDU2204_2.cpp b/TangDou/AcWing/RongChi/HDU2204_2.cpp index 55bac93..5866e68 100644 --- a/TangDou/AcWing/RongChi/HDU2204_2.cpp +++ b/TangDou/AcWing/RongChi/HDU2204_2.cpp @@ -4,6 +4,13 @@ using namespace std; #define endl "\n" const int N = 110; +/* +我们可以利用莫比乌斯系数进行简化计算,在上一个版本中,我们是按照奇加偶减的原则来进行的, +同样这个计算的过程可以通过莫比乌斯中的mu函数来直接算出,每次相乘的系数是-mu[i]。 + +执行时间:15MS + +*/ // 筛法求莫比乌斯函数 int mu[N], primes[N], cnt; bool st[N];