@ -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) {
@ -4,6 +4,13 @@ using namespace std;
#define endl "\n"
const int N = 110;
我们可以利用莫比乌斯系数进行简化计算,在上一个版本中,我们是按照奇加偶减的原则来进行的,
同样这个计算的过程可以通过莫比乌斯中的mu函数来直接算出,每次相乘的系数是-mu[i]。
// 筛法求莫比乌斯函数
int mu[N], primes[N], cnt;
bool st[N];