【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-

转载于:https://www.cnblogs.com/zhuier-xquan/p/11102826.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值