zoukankan      html  css  js  c++  java
  • 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; 
        
    }
  • 相关阅读:
    模拟登录
    服务器的
    多线程爬虫
    新浪微博
    。。
    ** turtle模块和random模块
    收藏链接python--向大神学习
    126邮箱发送邮件测试1
    LabVIEW版本控制(转)
    正交编码器单端转差分
  • 原文地址:https://www.cnblogs.com/xcg123/p/11105642.html
Copyright © 2011-2022 走看看