원본 링크 : https://www.cnblogs.com/xwl3109377858/p/11564317.html
연극 중에 사용 된 극장 지하에 칼 n 개의 종류가 있었다. 또한 있었다 정확하게 각 유형의 X의 칼입니다. Y 사람들은 극장 지하에 침입하고 그들 각각은 어떤 정확히 Z 칼 취한 하나의 유형을 . 다른 사람들이 칼의 다른 유형을 촬영했을 수도 있습니다. 값 y를 X, z는 당신을위한 알 수 있습니다.
다음날 아침 극장의 감독은 손실을 발견한다. 그는 모든 칼을 계산 - 정확히 i 번째 유형의 칼이 그대로 남아 있습니다 인공 지능.
감독은 지하에 각 유형의 칼의 초기 수에 대한 단서가없는, 지하에 얼마나 많은 칼 그들 각각 촬영 한 고장 사람들의 수.
예를 들어, N = 3, A = [3,12,6] 가능한 상황의 다음 하나가 X = Y (12) = 5 및 z = 3 인 경우. 그리고 처음 세 사람이 첫 번째 유형의 칼을 가져다가 다른 두 사람이 세 번째 유형의 칼을했다. 당신은 y 값의 X를 모르는 z는 사전에 있지만, N과의 값을 알 수 있습니다.
따라서 그는 당신의 도움을 추구합니다. 결정 최소 극장 지하에 침입 한 수 명 Y, 수, 그들 각각 취한 Z 칼의 수를.
입력
칼 타입의 수 - 입력의 첫 번째 라인은 하나의 정수 n (2≤n≤2⋅105)을 포함한다.
입력의 두 번째 라인은 시퀀스 A1 포함, A2, ..., (0≤ai≤109) AI가 도난 후의 지하에 남아있는 제 i 형의 칼의 개수와 동일 여기서. 이 AK를 ≠ j까지의 인덱스 (j, K)의 적어도 하나의 쌍 등이 존재 함을 보장한다.
산출
두 정수 y 및 z 인쇄 - 지하와 그들 각각 취한 칼의 수에 침입 수 있었다 사람의 최소 수를.
예
입력
삼
3 12 6
산출
5 3
입력
이
2 9
산출
1 7
입력
(7)
1000000000 2 4 6 8 2 4
산출
2999999987 2
입력
6
13 52 0 13 26 52
산출
(12) (13)
노트
그 중 셋은 첫 번째 유형의 3 개 칼을 촬영 한 : Y의 최소값은 5와 동일 첫 번째 예에서는 지하에 침입 한 수있는 사람의 최소 수 즉, 그들 각각은 3 개 칼을 취한 5입니다 두 사람은 세 번째 유형의 3 개 칼을 촬영했다.
In the second example the minimum value of y is 1, i.e. the minimum number of people who could have broken into the basement, equals to 1. He has taken 7 swords of the first type.
思路:用最大数减去所给的值,然后对前n-1个值求一个gcd,然后除掉gcd求和就是答案。
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<cstring>
5 #include<algorithm>
6 #include<map>
7 #include<set>
8 #include<vector>
9 #include<queue>
10 #include<list>
11 #include<stack>
12 using namespace std;
13 #define ll long long
14 const int mod=1e9+7;
15 const int inf=1e9+7;
16
17 const int maxn=2e5+10;
18
19 ll int gcd(ll int a,ll int b)
20 {
21 if(b==0)
22 return a;
23 else
24 return gcd(b,a%b);
25 }
26
27 int num[maxn];
28
29 int main()
30 {
31 ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
32
33 int n;
34 cin>>n;
35
36 int maxx=-1;
37
38 for(int i=0;i<n;i++)
39 cin>>num[i];
40
41 sort(num,num+n);
42
43 maxx=num[n-1];
44
45 int now;
46
47 for(int i=0;i<n-1;i++)
48 {
49 if(i==0)
50 now=maxx-num[i];
51 else
52 now=gcd(now,maxx-num[i]);
53 }
54
55 ll int ans=0;
56
57 for(int i=0;i<n-1;i++)
58 {
59 ans+=(maxx-num[i])/now;
60 }
61
62 cout<<ans<<" "<<now<<endl;
63
64 return 0;
65 }