Timus 2070 Interesting Numbers

題目連接: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 }
相關文章
相關標籤/搜索