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+BC 则第一个妹子的属性值变为 2 A 2A 2A,第二个妹子的属性值变为 2 B 2B 2B,第三个妹子的属性值变为 C − A − B C−A−B CAB
  • 否则 设 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,W1) 。 则第一个妹子的属性值变为 A − P A−P AP,第二个妹子的属性值变为 B + P − C B+P-C B+PC,第三个妹子的属性值变为 2 C 2C 2C
    牛半仙想知道第三个妹子经过 K K K 次变化后的属性值。 因为 牛半仙还要去和妹子畅谈人生,所以他把这个问题交给你了。
    链接:https://ac.nowcoder.com/acm/contest/7609/A
    来源:牛客网

简化体面给定两个数 a   ( a = A + B + C ) a\ (a=A+B+C) a (a=A+B+C) 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=ba , a=2a
否则 b = 2 ⋅ b   ,   a = a − b b=2\cdot b\ ,\ a=a-b b=2b , a=ab

讨论b的取值分类讨论可以得出结论
a n s = ( 2 k ⋅ b ) m o d ( a + b ) ans=(2^k \cdot b)mod(a+b) ans=(2kb)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);
	}
}

猜你喜欢

转载自blog.csdn.net/RA100FDM/article/details/109231398
今日推荐