main
黄海 2 years ago
parent 809cdd9a14
commit a41c93508b

@ -3,24 +3,26 @@ using namespace std;
#define int long long #define int long long
#define endl "\n" #define endl "\n"
// 60以内的质数列表 // 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};
/* /*
nsqrtn,
n nsqrt(n)
1e1826463 n
623 1e1826463
2^(3*5*7)260
623
2^(3*5*7)260
15MS 15MS
*/ */
signed main() { signed main() {
int n; int n;
while (cin >> n) { while (cin >> n) {
int s = 1, t; // s=1表示最起码数字1符合要求 int s = 1, t; // s=1表示最起码数字1符合要求
for (int i = 0; i < 17; i++) { // 三层循环遍历质数数组p枚举第一个因子 for (int i = 0; i < 17; i++) { // 三层循环遍历质数数组p枚举第一个因子
t = pow(n, 1.0 / p[i]) - 1; // 计算出指数=p[i]的数的个数,需要减去1见下面的注释解释 t = pow(n, 1.0 / primes[i]) - 1; // 计算出指数=p[i]的数的个数,需要减去1见下面的注释解释
if (!t) break; // 扣除完1^2后没有了那太白扯了 if (!t) break; // 扣除完1^2后没有了那太白扯了
/* /*
int n = 10; int n = 10;
cout << (int)pow(n, 1.0 / 2) << endl; cout << (int)pow(n, 1.0 / 2) << endl;
@ -30,15 +32,15 @@ signed main() {
*/ */
s += t; // t个但数字1不能考虑 s += t; // t个但数字1不能考虑
for (int j = i + 1; j < 17; j++) { // 三层循环,枚举第二个因子,避让第一个因子 for (int j = i + 1; j < 17; j++) { // 三层循环,枚举第二个因子,避让第一个因子
t = pow(n, 1.0 / (p[i] * p[j])) - 1; // 计算出指数=p[i]*p[j]的数的个数 t = pow(n, 1.0 / (primes[i] * primes[j])) - 1; // 计算出指数=p[i]*p[j]的数的个数
if (!t) break; // 扣除完1^2后没有了那太白扯了 if (!t) break; // 扣除完1^2后没有了那太白扯了
s -= t; // 两个的要减 s -= t; // 两个的要减
for (int k = j + 1; k < 17; k++) { // 三层循环,枚举第三个因子,避让第一、第二个因子 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]的数的个数 t = pow(n, 1.0 / (primes[i] * primes[j] * primes[k])) - 1; // 计算出指数=p[i]*p[j]*p[k]的数的个数
if (!t) break; // 扣除完1^2后没有了那太白扯了 if (!t) break; // 扣除完1^2后没有了那太白扯了
s += t; // 三个的要加 s += t; // 三个的要加
} }
} }
} }

Loading…
Cancel
Save