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; }