2024牛客寒假基础训练营4_D 守恒
//日练
题意:给定n个元素,每次操作选数组中两个元素,一个加1,另一个减1;限定操作后它们仍为正数。求数组的最大公因数可能值的种数
思路:不管如何操作,数组的总和不变;枚举前n-1个位置(相同),nth:s-(n-1)*i;求gcd放进set中
//注意:当n=1,gcd=a[1]
https://ac.nowcoder.com/acm/problem/266155
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int>pii;
const int N = 2e5 + 10;
int n;
int a[N];
int gcd(int a, int b)
{
if (!b)return a;
return gcd(b, a % b);
}
void solve()
{
cin >> n;
int s = 0;
for (int i = 1; i <= n; i++)
cin >> a[i], s += a[i];
set<int>st;
if(n>1)
for (int i = 1; i <= s/n; i++)
{
int m = s - (n - 1) * i;
if(m<=0)break;
st.insert(gcd(i, m));
}
else st.insert(s);
cout << st.size() << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int _ = 1;
// cin >> _;
while (_--)solve();
return 0;
}