次芝麻:数学

题目描述

小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 xy2y 2 x 、 x − y 2x 、x-y 2xxy 在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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jarden_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值