UVa 294 - Divisors

来源:互联网 发布:淘宝卖的aj哪里来的 编辑:程序博客网 时间:2024/05/18 20:11

通过这道题学到了2个知识:

1.一个数的质因子一定小于等于这个数的开根

2.一个数的因子(约数)数等于 π(各质因子数+1)

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int maxn = 55555;//#define DEBUGint vis[maxn];int prime[maxn];int cnt = 0;void GetPrime(){    memset(vis,0,sizeof(vis));    int m = sqrt(maxn) + 1;    for(int i = 2; i < m; i++)if(!vis[i]){        for(int j = i * i; j < maxn; j += i)            vis[j] = 1;    }    for(int i = 2; i < maxn; i++)        if(!vis[i]) prime[cnt++] = i;    #ifdef DEBUG    for(int i = 0; i < cnt; i++)        printf("%d ",prime[i]);    #endif // DEBUG}int solve(int n){    int sum = 1;    for(int i = 0; i < cnt && n > 1; i++){        if(n % prime[i] == 0){            int c = 1;            while(n % prime[i] == 0){                c ++;                n /= prime[i];            }            sum *= c;        }    }    return sum;}int main(){    int n,T;    GetPrime();    scanf("%d",&T);    while(T--){        int a,b;        scanf("%d%d",&a,&b);        int temp = 0;        int ret;        for(int i = a; i <= b; i++){            int e = solve(i);            if(temp < e){                temp = e;                ret = i;            }        }        printf("Between %d and %d, %d has a maximum of %d divisors.\n",a,b,ret,temp);    }    return 0;}

0 0