Codeforces Round #102 (Div. 2)——C. Help Farmer

这题只要看下题目的数据量就知道肿么做了。

1<=n<=10^9。直接暴力枚举其因子,时间复杂度为O(sqrt(n)*(sqrt(sqrt(n))));

想想应该能过,还有一点就是最大最小值的求法:

最大值:把3个因子中的最大值加1,其余加2.

最小值:把3个因子中的最小值加1,其余加2.

介个很容易证明。。。。。。还有一点要用__int64

View Code
 1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4
5 inline __int64 max(__int64 a, __int64 b, __int64 c)
6 {
7 if (a > b) {
8 if (a > c) {
9 return (a+1)*(b+2)*(c+2);
10 } else {
11 return (c+1)*(a+2)*(b+2);
12 }
13 } else {
14 if (b > c) {
15 return (b+1)*(a+2)*(c+2);
16 } else {
17 return (c+1)*(a+2)*(b+2);
18 }
19 }
20 }
21
22 inline __int64 min(__int64 a, __int64 b, __int64 c)
23 {
24 if (a < b) {
25 if (a < c) {
26 return (a+1)*(b+2)*(c+2);
27 } else {
28 return (c+1)*(a+2)*(b+2);
29 }
30 } else {
31 if (b < c) {
32 return (b+1)*(a+2)*(c+2);
33 } else {
34 return (c+1)*(a+2)*(b+2);
35 }
36 }
37 }
38
39 int main()
40 {
41 __int64 n;
42 scanf("%I64d",&n);
43 __int64 MAX;
44 __int64 MIN;
45 int cnt = 1;
46 for (int i(1); i*i<=n; ++i) {
47 if (n%i == 0) {
48 __int64 fir = n/i;
49 for (int j(1); j*j<=fir; ++j) {
50 if (fir%j == 0) {
51 __int64 sec = j;
52 __int64 thr = fir/j;
53 if (cnt == 1) {
54 ++cnt;
55 MAX = max(i,sec,thr);
56 MIN = min(i,sec,thr);
57 } else {
58 MAX = MAX > max(i,sec,thr)?MAX:max(i,sec,thr);
59 MIN = MIN < min(i,sec,thr)?MIN:min(i,sec,thr);
60 }
61 }
62 }
63 }
64 }
65 printf("%I64d %I64d\n",MIN-n,MAX-n);
66 return 0;
67 }



你可能感兴趣的:(codeforces)