定理:设,那么的值为
(1)为素数,那么答案就是
(2)有多个素因子,那么答案就是
(3)只有一个素因子,那么答案就是该素因子
时间复杂度略高
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
//int judge(int n){
// int tmp = sqrt(n+0.5) ;
// for(int i = 2 ; i <= tmp ; ++i){
// if(n%i == 0) {
// return true ;
// }
// }
// return false ;
//}
long long ans[1000000+1] ;
int Pri[10005] ;
bool pri[10005] ;
void prime(){
for(int i = 0 ; i <= 10000 ; ++i){
pri[i] = true ;
}
int pri_num = 0 ;
for(int i = 2 ;i <= 10000 ; ++i){
if(pri[i]) {
Pri[pri_num++] = i ;
for(int j = i*i ; j <= 10000 ; j+=i){
pri[j] = false ;
}
}
}
}
long long decompose(long long n){
int t = n ;
int p ;
int p_num = 0;
int tmp = sqrt(n+0.5) ;
for(int i = 0 ; Pri[i] <= tmp ;++i){
if(n==1)break;
if(n%Pri[i]==0){
p_num++;
while(n%Pri[i]==0){
n/=Pri[i];
}
p = Pri[i] ;
}
if(p_num>1)return 1 ;
}
if(t == n) {
return n ;
}
if(n>1 || p_num>1){ // have big P ,
return 1 ;
}
return p ;
}
int main(){
ans[2] = 0;
prime() ;
for(int i = 3 ; i <= 1000000 ; ++i){
ans[i] += ans[i-1] + decompose(i) ;
}
int n ;
while(~scanf("%d",&n)){
printf("%lld\n",ans[n]) ;
}
return 0 ;
}