=== ===
=== ===
题解
因为每次总是要对较小的那一个进行操作,所以考虑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;
}
偏偏在最后出现的补充说明
考虑单次操作的影响是一个常用的思路。