Codeforces 라운드 # 587 (사업부 3.) D - 칼

원본 링크 : https://www.cnblogs.com/xwl3109377858/p/11564317.html

Codeforces 라운드 # 587 (사업부. 3)

D -

연극 중에 사용 된 극장 지하에 칼 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 }

 

추천

출처www.cnblogs.com/xwl3109377858/p/11564317.html