又是数学题...
假设给定一个序列,该序列不是以0开头的等差数列,且最大值为a[n-1]
那么其最后的结果必然是1-a[n-1]的一个全排列
因此,最后可以填充的数的个数是a[n-1]-n个
那么如果是以0开头的等差数列有该怎么办呢?
简单!
求出所有数的最大公约数,再把数组中元素依次除以这个公约数即可
开始我觉得我的思路很牛的...
但是因为队友连A3道题,我一道没写出来,就紧张了
导致连最大公约数的函数都写不出来了
另外这一道题我WA了8次,之所以一直卡住就是我求最大公约数的方法是两两求,现在看很明显是错的
但当时无论如何转不过这个弯...后来还是对有提醒的
就因为这个题跪了8次,导致我们队的排名从第1到第4...
愧对队友!继续努力吧
代码如下:
#include <set>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define ll long long
using namespace std;
ll a[MAXN];
ll gcd(ll a, ll b) {
while(b) {
ll temp = a%b;
a = b;
b = temp;
}
return a;
}
int main(void) {
int n;
while(cin >> n) {
ll sub = 1e9+10;
for(int i=0; i<n; ++i) {
cin >> a[i];
}
sort(a, a+n);
sub = gcd(a[0], a[1]);
for(int i=2; i<n; ++i) {
sub = gcd(a[i], sub);
}
for(int i=0; i<n; ++i) {
a[i] /= sub;
//cout << a[i] << " ";
}
ll x = a[n-1]-n;
if(x % 2) {
cout << "Alice" << endl;
}
else cout << "Bob" << endl;
}
return 0;
}
另外最大公约数函数写的太撮了,下面附上高端点的GCD函数:
int gcd(int a, int b) {
return (b == 0 ? a : gcd(b, a % b));
}