2019.6.28 校内测试 T2 【音乐会】二重变革

看到这个题之后,一个很暴力很直接的想法就是贴上题目中的代码然后交上去走人,但是很显然这是会TLE+MLE的,想想谁会这么傻把主要代码给你QwQ~;

其实这段代码是想告诉你一件事:用序列中的大数减去小数,直到序列中所有的数一样为止!

这就意味着最后的答案一定是某个数乘以 n!

证明:

n=2的情况

想一想n=2的情况。这时这段代码的任务就是:用两个数中较大的数减去较小的数,一直到两数相等为止。
这不就是更相减损术吗!

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int read()
{
    char ch=getchar();
    int a=0,x=1;
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') x=-x;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        a=(a<<1)+(a<<3)+(ch-'0');
        ch=getchar();
    }
    return a*x;
}
int gcd(int a,int b)           //扩展欧几里得求最大公约数 
{
    if(b==0) return a;
    else return gcd(b,a%b);
}
int n,gcdd,a;
int main()
{
    n=read();
    gcdd=read();               //先使第一个数为gcdd 
    for(int i=2;i<=n;i++) 
    {
        a=read();
        if(gcdd==1) continue;  //若前几个数的最大公约数已经是1了,再求下去肯定还是一,那就不用求了 
        gcdd=gcd(gcdd,a);      //否则就一直求 
    }
    printf("%d",gcdd*n);
    return 0; 
    
}
原文地址:https://www.cnblogs.com/xcg123/p/11105642.html