题目描述
小G和小X都是小次货。
身为小次货,最重要的事情当然就是次啦!所以他们正在纠结如何分芝麻次。
一开始,小G有n个芝麻,小X有m个芝麻。
因为他们都想次更多芝麻,所以每次手中芝麻较少的人就会拿走另一个人的芝麻,使得自己的芝麻变成原来的2倍那么多。如果两个人芝麻一样多,那么小G会拿走小X的芝麻使得他的芝麻变成原来的2倍。
经过k次这样的行动之后,小G和小X都累了,所以他们准备开始次芝麻了。身在一旁的小Z想知道,小G和小X中次的较少的那个人次了多少芝麻呢?
题解
因为我们发现
x
+
y
x+y
x+y是一个定值。
x
−
y
、
2
y
x-y 、 2y
x−y、2y 和
2
x
、
x
−
y
2x 、x-y
2x、x−y 在mod
x
+
y
x+y
x+y下是相等的
所以只要对一侧求它翻
2
k
2^k
2k对
x
+
y
x+y
x+y取膜即可
PS:对于这种过程需要考虑大小变化的问题可以先考虑无视大小暴力做骗分 ,也就是说你会发现这个问题在某种情况下比如膜某一个数的时候得到的值和老老实实算且模这个值是一样的,且老老实实算和模一个值你能得到正确答案,那么你就能通过诡异的方法算出来的答案算出正确答案
也就是说!要把复杂的问题转化,思考两种情况在什么状态下是一样的
代码
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
int Pow(int x){
int res=1;
while(k){
if(k&1) res=1ll*res*x%(n+m);
x=1ll*x*x%(n+m); k>>=1;
}
return res;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
int x=1ll*n*Pow(2)%(n+m);
printf("%d",min(x,n+m-x));
return 0;
}