T83310 【音乐会】二重变革

T83310 【音乐会】二重变革

 

题解

你看数据那么大,又是一道数学题

题面描述这么个代码肯定不能傻fufu的直接把代码提交上去 我批评我自己  

 

观察代码当中有一行

也就是说明最后这个数列都将变成同一个数字,否则会一直进行下去

所以答案应该是 n*这个数字

 

 

于是乎别人惊奇的发现:

答案=这段序列所有数字的gcd * 序列长度 n 

 

证明

咱也不知道为啥,反正它就这个样,接下来我们证明一下:

当n=2时,代码就变成:

if ( X[1]>X[2])那么大数就变成大数减小数

(X[1] , X[2])->(X[2] , X[1]-X[2])

这不就是更相减损术么!!

 

那么我们继续把n推广到更大,那么最后每个数都变成了数列的gcd

证明

假设一开始所有数的 gcd 为 d 

更相减损术无论操作多少次,这些数字的最大公因数都是不变的

最后数列里的数都变成一个数,设为k

那么此时他们的 gcd 就是 k 

那么 k=d 

end

 

PS:

假如数据随机生成,那么这些数字的 gcd 为1的可能性极大,所以直接输出n就好

但是这道题不随机生成QWQ

 

代码

#include<bits/stdc++.h>

using namespace std;

int n,d=0,x,y;
long long ans;

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

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*10+ch-'0',ch=getchar();
    if(last=='-') ans=-ans;
    return ans;
}

int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {
        x=read();
        d=gcd(d,x);
    }
    ans=d*n;
    printf("%ld\n",ans);
    
    return 0;
}

 

posted @ 2019-06-28 14:26  晔子  阅读(298)  评论(0编辑  收藏  举报