[校内测试]Sunshine's book(快速幂)

=== ===

这里写图片描述
这里写图片描述

=== ===

题解

因为每次总是要对较小的那一个进行操作,所以考虑a操作以后会变成什么。
如果a小于b,那么a将会变成2*a;否则a会变成a-b。关键是想到a-b可以写作2*a-(a+b)。可以发现减去a+b的原因就是为了保证2*a不要大于a+b,这和取模操作十分类似。也就是说a每次操作完了会变成2*a%(a+b)。一共要进行k次,把这k个2提出来做快速幂然后就可以得到a,进而也就可以得到b。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a,b,k,p;
int powww(long long v,int t,int Mod){
    long long ans=a;
    while (t!=0){
        if (t&1) ans=(ans*v)%Mod;
        v=(v*v)%Mod;t>>=1;
    }
    return ans;
}
int main()
{
    scanf("%d%d%d",&a,&b,&k);
    p=powww(2,k,a+b);
    printf("%d\n",min(p,a+b-p));
    return 0;
}

偏偏在最后出现的补充说明

考虑单次操作的影响是一个常用的思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值