2020牛客NOIP赛前集训营-提高组(第三场)T1牛半仙的妹子数
牛半仙有三个妹子,属性值分别为 A A A, B B B, C C C。 这三个妹子有心灵感应,当一个人的属性值变化时其他人的属性值也会跟着变化。
变化规律如下: 假设第一个妹子属性值为 A A A ,第二个妹子属性值为 B B B,第三个妹子属性值为 C C C,
- 若 A + B ≤ C A+B≤C A+B≤C 则第一个妹子的属性值变为 2 A 2A 2A,第二个妹子的属性值变为 2 B 2B 2B,第三个妹子的属性值变为 C − A − B C−A−B C−A−B。
- 否则 设 A A A, B B B 中较小的属性值为 W W W, P = m i n ( ⌊ C / 2 ⌋ , W − 1 ) P=min(\lfloor C/2\rfloor,W-1) P=min(⌊C/2⌋,W−1) 。 则第一个妹子的属性值变为 A − P A−P A−P,第二个妹子的属性值变为 B + P − C B+P-C B+P−C,第三个妹子的属性值变为 2 C 2C 2C。
牛半仙想知道第三个妹子经过 K K K 次变化后的属性值。 因为 牛半仙还要去和妹子畅谈人生,所以他把这个问题交给你了。
链接:https://ac.nowcoder.com/acm/contest/7609/A
来源:牛客网
简化体面给定两个数
a
(
a
=
A
+
B
)
a\ (a=A+B)
a (a=A+B) 和
b
(
b
=
C
)
b\ (b=C)
b (b=C)
若
b
>
a
b>a
b>a 则
b
=
b
−
a
,
a
=
2
⋅
a
b=b-a\ ,\ a=2\cdot a
b=b−a , a=2⋅a
否则
b
=
2
⋅
b
,
a
=
a
−
b
b=2\cdot b\ ,\ a=a-b
b=2⋅b , a=a−b
讨论b的取值分类讨论可以得出结论
a
n
s
=
(
2
k
⋅
b
)
m
o
d
(
a
+
b
)
ans=(2^k \cdot b)mod(a+b)
ans=(2k⋅b)mod(a+b)
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull t,u,v,mod,b,k,ans;
inline ull ksm(ull x,ull y){
ull res=1;
while(y){
if(y&1)res=res*x%mod;
x=x*x%mod; y>>=1;
}
return res;
}
int main(){
scanf("%llu",&t);
while(t--){
scanf("%llu %llu %llu %llu",&u,&v,&b,&k);
mod=u+v+b;
ans=ksm(2,k)*b%mod;
printf("%llu\n",ans);
}
}