题目:
这个题目,我先开始尝试直接求出每个素因子的次数,然后全部加起来。
代码:
#include<iostream> using namespace std; int degree_in_fact(int m, int p) { if (m)return degree_in_fact(m / p, p) + m / p; return 0; } bool isprime(int n) { if (n == 2)return true; if (n % 2 == 0)return false; for (int i = 3; i*i <= n; i += 2)if (n%i == 0)return false; return true; } int main() { int n; while (cin >> n) { int sum = 0; for (int i = 2; i <= n; i++)if (isprime(i))sum += degree_in_fact(n, i); cout << sum << endl; } return 0; }
但是超时了,想必是因为测试用例比较多。
所以只好改成打表的方法。
代码:
#include<iostream> using namespace std; int sum[1000001]; bool isprime(int n) { if (n == 2)return true; if (n % 2 == 0)return false; for (int i = 3; i*i <= n; i += 2)if (n%i == 0)return false; return true; } int main() { for (int i = 0; i < 1000001; i++)sum[i] = 0; for (int i = 2; i < 1000001; i++) { if (isprime(i)) { long long m = i; while (m < 1000001) { for (int j = m; j < 1000001; j += m)sum[j]++; m *= i; } } } for (int i = 1; i < 1000001; i++)sum[i] += sum[i - 1]; int n; while (cin >> n)cout << sum[n] << endl; return 0; }
这个打表的方法类似于筛法(其实本质上确实是一样的)
时间: 2024-11-02 00:11:48