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

相關文章
相關標籤/搜索