Topcoder SRM 664 DIV 1
2015-09-02 19:27
417 查看
BearPlays 快速幂
题意:给你两个数A,B,有种操作是将大的数减去小的数,并将小的数乘以2。反复k次,问你最后的小的数回是多少。
题解:
由于整个过程$A+B$的值是不会改变的。现在令$S=A+B$,那么这两种操作可以看作如下两种形式:
若$A$是较小的那个数,那么$A=A*2$
若$A$是较大的那个数,那么$A=A-B=A-(S-A)=A*2-S$,由于$S*2>=A*2$,则$A=A*2 mod S$
所以我们发现实际上就是计算$A*2^k mod S$,这里用快速幂即可。算法复杂度是$O(logk)$
代码:
LL PowerMod(LL a, LL b, LL c) { LL ans = 1; a = a % c; while(b>0) { if(b % 2 == 1) ans = (ans * a) % c; b = b/2; a = (a * a) % c; } return ans; } class BearPlays { public: int pileSize(int A, int B, int K) { LL s=A+B; LL t=PowerMod(2,K,s); return min(A*t%s,B*t%s); } };
View Code
相关文章推荐
- 使用Scrapy建立一个网站抓取器
- 修改apache日志文件路径
- CentOS6.5 x64 Hadoop学习过程
- 自学的一些网站,自己在学,慢慢往里面填
- linux运维实战练习-正则表达式
- linux 环境命令行导出dmp文件
- linux运维实战练习-正则表达式
- head命令
- sort命令
- xxd命令
- dumpe2fs命令
- linux——函数库管理
- ulimit命令
- Linux Vim,Find使用方法以及磁盘与文件系统管理
- ls命令
- [Hadoop]使用DistributedCache进行复制联结
- nginx 负载均衡
- Linux系统中的root超级权限的控制
- linux下ssh安全连接
- OPS - Parrallel Control System