題目連接:http://acm.timus.ru/problem.aspx?space=1&num=2070ios
題目描述:spa
題目大意是給定範圍[L, R],求該範圍中interesting數的個數。rest
interesting數的定義爲:code
1.素數blog
2.不爲素數且其正因子的個數不爲素數個(如:6: 1,2,3,6)ci
計算正因子的個數通常使用的是分解質因數了,若 n = p1^a1 * p2^a2 * ... pm^amget
那麼正因子的個數爲 k = (a1+1) * (a2+1) * ... * (am+1),所以:
若m>1,k必爲非素數,則爲interesting數,
若m=1,則a1+1爲非素數便可string
所以能夠直接計算非interesting數的計算則爲:m = 1, 且 a1+1爲素數,但a1>1,所以能夠用素數來篩選。it
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std ; 5 6 long long ll, rr ; 7 const int MAXM = 1000005 ; 8 bool is_prim[MAXM] ; 9 int prims[MAXM], totals ; 10 11 void init(){ 12 totals = 0 ; 13 memset(is_prim, true, sizeof(is_prim)) ; 14 for( int i = 2; i < MAXM; i++ ){ 15 if( is_prim[i] ){ 16 prims[totals++] = i ; 17 for( int j = 2; i*j < MAXM; j++ ) is_prim[i*j] = false ; 18 } 19 } 20 } 21 22 void solve(){ 23 init() ; 24 long long res = rr - ll + 1 ; 25 26 for( int i = 0; i < totals && prims[i]*prims[i] <= rr; i++ ){ 27 long long val = 1 ; 28 int num = 0 ; 29 for( int j = 1; j < totals; j++ ){ 30 for( int k = num; k < prims[j]-1; k++ ){ 31 val *= prims[i] ; 32 if( val > rr ) break ; 33 } 34 if( val > rr ) break ; 35 num = prims[j] - 1; 36 37 if( val >= ll && val <= rr ) res-- ; 38 } 39 } 40 41 cout << res << endl ; 42 } 43 44 int main(){ 45 freopen("1234.txt", "r", stdin) ; 46 cin >> ll >> rr ; 47 solve() ; 48 return 0 ; 49 }