【6.28校内test】T2 【音乐会】二重变革
T2其实是一道数学题,因为你看:
2MB??一共就可以存下个int,然鹅再看数据范围:
那么大是稳稳的不是TLE就是MLE了,所以肯定是数学题,而且是只需要存很少数据的数学题。所以我们也不知道该怎么办了,然后lz日常开始考场上的打表找规律:
样例#1: 样例#2:但是现在看并没有什么规律可言,然后我们在自己搞几个数据试试:
我们发现,x在减完后最后都会变成一样的数,这个数有什么规律呢?定睛一看,其实是输入的所有x的最大公约数!
偷走wz证明:
所以我们就可以大胆猜想了:求出x1~xn的最大公约数,然后*n就是答案(当然确实是这样的),求最大公约数,可以用gcd来求:
int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); }
然后我们也不必把所有的x都存下来,只需要记录一个x,以及当前所有输入了的x的最大公约数gcdd就可以啦(然后悄咪咪的小优化:当gcdd=1时就可以不用往下求了,不过好像并快不了几毫秒)
CODE:
#include<bits/stdc++.h> using namespace std; 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<<3)+(ans<<1)+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int n,x,gcdd; long long ans; int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); } int main(){ n=read(); for(int i=1;i<=n;i++){ x=read(); gcdd=gcd(gcdd,x); if(gcdd==1) break; } ans=gcdd*n; printf("%lld",ans); return 0; }
end-