【6.28校内test】T2 【音乐会】二重变革

【音乐会】二重变革【题目链接】

T2其实是一道数学题,因为你看:

2MB??一共就可以存下个int,然鹅再看数据范围:

那么大是稳稳的不是TLE就是MLE了,所以肯定是数学题,而且是只需要存很少数据的数学题。所以我们也不知道该怎么办了,然后lz日常开始考场上的打表找规律:

样例#1:  样例#2:但是现在看并没有什么规律可言,然后我们在自己搞几个数据试试:

我们发现,x在减完后最后都会变成一样的数,这个数有什么规律呢?定睛一看,其实是输入的所有x的最大公约数!

偷走wz证明:

所以我们就可以大胆猜想了:求出x1~xn的最大公约数,然后*n就是答案(当然确实是这样的),求最大公约数,可以用gcd来求:

int gcd(int a,int b){
    if(b==0) return a;
    return gcd(b,a%b);
}

然后我们也不必把所有的x都存下来,只需要记录一个x,以及当前所有输入了的x的最大公约数gcdd就可以啦(然后悄咪咪的小优化:当gcdd=1时就可以不用往下求了,不过好像并快不了几毫秒)

CODE:

#include<bits/stdc++.h>

using namespace std;

inline int read(){
    int ans=0;
    char last,ch=getchar();
    while(ch<'0'||ch>'9') last=ch,ch=getchar();
    while(ch>='0'&&ch<='9') ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    if(last=='-') ans=-ans;
    return ans;
}

int n,x,gcdd;
long long ans;

int gcd(int a,int b){
    if(b==0) return a;
    return gcd(b,a%b);
}

int main(){
    n=read();
    for(int i=1;i<=n;i++){
        x=read();
        gcdd=gcd(gcdd,x);
        if(gcdd==1) break;
    }
    ans=gcdd*n;
    printf("%lld",ans);
    return 0;
}

end-

原文地址:https://www.cnblogs.com/zhuier-xquan/p/11102826.html