题目链接:I-最大公约数_第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 (nowcoder.com)https://ac.nowcoder.com/acm/contest/27302/I
题解:由题目我们可以知道经过一系列的操作后,该数组所有值的和不会变化,还是sum。因为这些操作无非是让该数组中的一个数+1,另一个数-1。
可以假设操作完之后的数组为Ai,最大公约数为x,那么一定存在一定的序列Xi满足:Ai=Xi*x;
Ai的和为sum,所以可以知道x为sum的因子数。x可以为Ai数组的最大公因数,此时我们只需要找sum的因子数个数就行了。
代码如下:
#include<iostream>
using namespace std;
//思路:假设操作之后的序列为Ai,最大公约数为x,
//那么一定存在序列Ki满足Ai=x*Ki。
//由于操作不会改变sum{Ki}的值,sum的值一直不变,因为是一方+1一方-1
//可以知道x是sum因子,所以直接计算sum的因子数即可。
int a[500010];
int main(){int n;cin>>n;int sum=0,ans=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}for(int i=1;i*i<=sum;i++){if(sum%i==0){if(i*i==sum)ans++;elseans+=2; }}cout<<ans<<endl;return 0;
}