URAL1118. Nontrivial Numbers

1118

优化

1.枚举到sqrt(n)2.区间有质数直接输出最大质数3.a=1 直接输出1 4.边+边与最小值比较

 

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 #include<cmath>

 7 using namespace std;

 8 #define N 1000010

 9 double minz = N;

10 bool f[N];

11 void init()

12 {

13     int i,j;

14     for(i = 2 ; i <= 1000 ; i++)

15     {

16         if(!f[i])

17         {

18             for(j = i+i ; j <= N-10 ; j+=i)

19             f[j] =  1;

20         }

21     }

22 }

23 double find(int k)

24 {

25     int i;

26     int x = sqrt(k*1.0);

27     double sum=0;

28     sum+=1;

29     for(i = 2 ; i <= x ; i++)

30     {

31         if(k%i==0)

32         {

33            sum+=k/i+i;

34         }

35         if(sum/k>minz) break;

36     }

37     return sum/k;

38 }

39 int main()

40 {

41     int i,a,b;

42     init();

43     cin>>a>>b;

44     int ans=-1;

45     if(a==1)

46     {

47         printf("1\n");

48         return 0;

49     }

50     for(i = a ; i <= b ; i++)

51     {

52         if(!f[i]) ans = i;

53     }

54     if(ans!=-1)

55     {

56         printf("%d\n",ans);

57         return 0;

58     }

59     for(i = a; i <= b ; i++)

60     {

61         double s = find(i);

62         if(s<minz)

63         {

64             ans = i;

65             minz = s;

66         }

67     }

68     printf("%d\n",ans);

69     return 0;

70 }

 

你可能感兴趣的:(number)