우리가 알고 있듯이 log(x*y) =log(x) + log(y). 따라서 우리는 1에서 N까지의 모든 로그 값을 계산하는 데 필요한 최소 로그 값 수를 알 수 있습니다. 따라서 N이 6이면 출력은 log(1)에서 log(6)과 같이 3이 됩니다. log(1)을 제외한 세 개의 로그 값이 필요합니다. log(1)은 항상 0이므로 무시하십시오. 이제 log(2) 및 log(3)에 대해 찾아야 합니다. 그 후 log(4)의 경우 이것은 log(2)+ log(2)이지만 log(2)의 값을 알고 있으므로 이를 다시 계산하지 않습니다. log(5)의 경우 계산해야 합니다. 이제 count는 3, log(6) =log(3) + log(2)이며 이미 알려져 있으므로 count는 3입니다.
이 문제는 1에서 N 범위의 소수를 찾기 위해 축소될 수 있습니다. 소수의 경우 로그 값을 독립적으로 계산해야 한다는 것을 알 수 있습니다. 그렇지 않으면 인수분해하고 계산해야 합니다.
예시
#include<iostream> #include<vector> #define MAX 1000005 using namespace std; vector<int> prime(MAX, 1); void seive(int N) { prime[0] = prime[1] = 0; for (int i = 2; i <= N; i++) { if (prime[i] == 1) { for (int j = 2; i * j <= N; j++) prime[i * j] = 0; } } } int numberOfLogs(int N) { int log_count = 0; seive(N); for (int i = 1; i <= N; i++) { if (prime[i] == 1) log_count++; } return log_count; } int main() { int N = 8; cout<<"Minimum number of log counts required: " << numberOfLogs(N)<<endl; }
출력
Minimum number of log counts required: 4