uva294

题目连接:UVA - 294

 1 #include<cstdio>
 2 int L,R;
 3 int cnt;
 4 int pri[1010];
 5 int vis[1010];
 6 void is_pri()
 7 {
 8     cnt=0;
 9     for(int i=3;i<35;i++) if(!vis[i])
10         for(int j=i*i;j<1010;j+=i)
11             vis[j]=1;
12     for(int i=2;i<1010;i++) if(!vis[i])
13         pri[cnt++]=i;
14 }
15
16 int divisor(int x)
17 {
18     int r=1;
19     for(int i=0;i<cnt;i++)
20     {
21         int tmp=1;
22         while(x%pri[i]==0) {tmp++;x/=pri[i];}
23         r*=tmp;
24         if(x==1) break;
25     }
26     return r;
27 }
28 int main()
29 {
30     is_pri();
31     int t;
32     scanf("%d",&t);
33     while(t--)
34     {
35         int ans=-1;
36         int res;
37         scanf("%d%d",&L,&R);
38         for(int i=L;i<=R;i++)
39         {
40            int temp=divisor(i);
41            if(temp>ans)
42            {
43                ans=temp;
44                res=i;
45            }
46         }
47         printf("Between %d and %d, %d has a maximum of %d divisors.\n",L,R,res,ans);
48
49     }
50 }
时间: 2024-10-10 07:17:02

uva294的相关文章

uva294(唯一分解定理)

题目链接: 唯一分解定理求约数. 1 #include<cstdio> 2 int L,R; 3 int cnt; 4 int pri[1010]; 5 int vis[1010]; 6 void is_pri() //预处理素数表 7 { 8 cnt=0; 9 for(int i=2;i<35;i++) if(!vis[i]) 10 for(int j=i*i;j<1010;j+=i) 11 vis[j]=1; 12 for(int i=2;i<1010;i++) if(!

习题10-9 约数 UVa294

1.题目描述:点击打开链接 2.解题思路:本题利用暴力搜索解决.因为题目中R-L最大不超过10000,可以直接进行搜索.并用ans,p分别标记目前找到的约数最多的个数以及对应的整数.因此关键问题是如何快速计算一个整数n的正约数的个数. 方法是这样的:可以从2开始尝试,如果n包含这个素数,那么就把它"除干净",这样既可保证后面找到的因子均为素数,只需要枚举到sqrt(n)时即可停止.这样做的好处是不需要提前生成素数表即可得到n的唯一分解式.假设一共可以整除res次,那么累乘上res+1.