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

【音乐会】二重变革【题目连接】c++

T2实际上是一道数学题,由于你看:优化

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

那么大是稳稳的不是TLE就是MLE了,因此确定是数学题,并且是只须要存不多数据的数学题。因此咱们也不知道该怎么办了,而后lz平常开始考场上的打表找规律:3d

样例#1:  样例#2:可是如今看并无什么规律可言,而后咱们在本身搞几个数据试试:code

咱们发现,x在减完后最后都会变成同样的数,这个数有什么规律呢?定睛一看,实际上是输入的全部x的最大公约数!blog

偷走wz证实:get

 

因此咱们就能够大胆猜测了:求出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时就能够不用往下求了,不过好像并快不了几毫秒)it

CODE:ast

#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-

相关文章
相关标签/搜索