|
|
|
@ -3,24 +3,26 @@ using namespace std;
|
|
|
|
|
#define int long long
|
|
|
|
|
#define endl "\n"
|
|
|
|
|
// 60以内的质数列表
|
|
|
|
|
int p[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59};
|
|
|
|
|
int primes[] = {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次方了,所以我们只需要考虑三部分就可以了。
|
|
|
|
|
思路:
|
|
|
|
|
如果是求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) {
|
|
|
|
|
int s = 1, t; // s=1表示最起码数字1符合要求
|
|
|
|
|
for (int i = 0; i < 17; i++) { // 三层循环,遍历质数数组p枚举第一个因子
|
|
|
|
|
t = pow(n, 1.0 / p[i]) - 1; // 计算出指数=p[i]的数的个数,需要减去1,见下面的注释解释
|
|
|
|
|
if (!t) break; // 扣除完1^2后,没有了,那太白扯了
|
|
|
|
|
int s = 1, t; // s=1表示最起码数字1符合要求
|
|
|
|
|
for (int i = 0; i < 17; i++) { // 三层循环,遍历质数数组p枚举第一个因子
|
|
|
|
|
t = pow(n, 1.0 / primes[i]) - 1; // 计算出指数=p[i]的数的个数,需要减去1,见下面的注释解释
|
|
|
|
|
if (!t) break; // 扣除完1^2后,没有了,那太白扯了
|
|
|
|
|
/*
|
|
|
|
|
int n = 10;
|
|
|
|
|
cout << (int)pow(n, 1.0 / 2) << endl;
|
|
|
|
@ -30,15 +32,15 @@ signed main() {
|
|
|
|
|
*/
|
|
|
|
|
s += t; // t个,但数字1不能考虑
|
|
|
|
|
|
|
|
|
|
for (int j = i + 1; j < 17; j++) { // 三层循环,枚举第二个因子,避让第一个因子
|
|
|
|
|
t = pow(n, 1.0 / (p[i] * p[j])) - 1; // 计算出指数=p[i]*p[j]的数的个数
|
|
|
|
|
if (!t) break; // 扣除完1^2后,没有了,那太白扯了
|
|
|
|
|
s -= t; // 两个的要减
|
|
|
|
|
for (int j = i + 1; j < 17; j++) { // 三层循环,枚举第二个因子,避让第一个因子
|
|
|
|
|
t = pow(n, 1.0 / (primes[i] * primes[j])) - 1; // 计算出指数=p[i]*p[j]的数的个数
|
|
|
|
|
if (!t) break; // 扣除完1^2后,没有了,那太白扯了
|
|
|
|
|
s -= t; // 两个的要减
|
|
|
|
|
|
|
|
|
|
for (int k = j + 1; k < 17; k++) { // 三层循环,枚举第三个因子,避让第一、第二个因子
|
|
|
|
|
t = pow(n, 1.0 / (p[i] * p[j] * p[k])) - 1; // 计算出指数=p[i]*p[j]*p[k]的数的个数
|
|
|
|
|
if (!t) break; // 扣除完1^2后,没有了,那太白扯了
|
|
|
|
|
s += t; // 三个的要加
|
|
|
|
|
for (int k = j + 1; k < 17; k++) { // 三层循环,枚举第三个因子,避让第一、第二个因子
|
|
|
|
|
t = pow(n, 1.0 / (primes[i] * primes[j] * primes[k])) - 1; // 计算出指数=p[i]*p[j]*p[k]的数的个数
|
|
|
|
|
if (!t) break; // 扣除完1^2后,没有了,那太白扯了
|
|
|
|
|
s += t; // 三个的要加
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|