zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        
        return 0;
    }
  • 相关阅读:
    第4次作业得分-东师软工
    第3次作业得分-东师软工
    C语言-第3次作业得分
    NPM
    Node模块化
    spring源码解析前瞻
    单例DCL模式
    dubbo-admin安装
    linux 安装Zookeeper
    Tomcat在Linux上的安装与配置
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11102482.html
Copyright © 2011-2022 走看看