ACM UVA-294

這題是給定一個範圍的數字,假設是1到100,要找出哪一個數字有最多的除數。

這題就相當於做質因數分解,假設有個數字N = 2^2 X 3^2 X 7,那它的除數個數就相當於(2+1)*(2+1)(1+1)。

首先是質數篩,一個合數N必定有小於等於sqrt(N)的質因數,所以我們要先算出小於等於N以下的質數有幾個。

bool is_prime[31631];
unsigned long long prime[16000];
int main(int argc, char const* argv[])
{
    int m = 0;
    for(int i = 2;i <= 31630;i++){
        if(!is_prime[i]){
            prime[m++] = i;
            for(int j = i*i;j <= 31630;j = j+i){
                is_prime[j] = true;

            }
        }
    }
    unsigned long long l,u;
    int pp;
    while(~scanf("%d ",&pp)){
        while(pp--){
        scanf("%llu %llu",&l,&u);
        int max = 0;
        unsigned long long ans_i;
        for(unsigned long long i = l;i <= u;i++){
            unsigned long long tmp = i;
            int ans = 1;
            for(int j = 0;prime[j]*prime[j]<= tmp && j<m;j++) {
                if(tmp%prime[j] == 0){
                    int count = 0;
                    while(tmp%prime[j] == 0){
                        tmp = tmp/prime[j];
                        count++;
                    }
                    ans = ans*(count+1);
                }
            }
            //表示還有一個質因數
            //比如說2^2X3^2X7,7會被留下來
            if(tmp>1){
                ans = ans*2;
            }
            if(ans>max){
                max = ans;
                ans_i = i;
            }
        }
        printf("Between %llu and %llu, %llu has a maximum of %d divisors.\n",l,u,ans_i,max);
        }
    }

    return 0;
}