问题描述:
输入:
新的超级病毒爆发了!目前尚未找到有效的治疗方法!它的名字叫“HJ”。
假如 0 时刻人群中有 1 个人感染了HJ,那个人就会感染另一个人,那么 1 时刻后就会有 2 个人感染, 2 时刻后就会有 4 个人感染, 3 时刻后就会有 8 个人感染。
相应的,假如 0 时刻人群中有 3 个人感染了HJ,那 3 个人就会感染另外 3 个人,那么 1 时刻后就会有 6 个人感染……
如果 0 时刻有 n 个人感染了HJ,那么 t 时刻后有多少人感染呢?
结果对 1000000007 取余
输出:
多组测试数据,每组包含两个整数,n,t(1≤n≤10000,1≤t≤10000000000)
输入以 EOF 结束
样例输入:
1 4 2 4 3 4 4 4 999 999999999
样例输出:
16 32 48 64 742187513
原因分析:
本题本质算出2的t次幂,再乘n,但因为 1≤t≤10000000000 ,首先就得考虑long long,其次考虑若利用循环求出结果,时间 超时;若用pow 数太大会超过pow函数的计算范围 所以只能使用快速幂
解决方案:
#include <stdio.h>
#define mod 1000000007 // result以及base 每次运算都要记得取余,防止数据太大存不下
typedef long long LL;long long fastPower(long long base, long long power) {long long result = 1;while (power > 0) {if (power & 1) //此处等价于if(power%2==1) /位运算:奇数的二进制最后一位为1,偶为0{ result = result * base % mod;}power >>= 1; //此处等价于power=power/2 位运算(二进制往右移一位) base = (base * base) % mod;}return result;
}int main()
{LL n,t;while(scanf("%lld%lld", &n, &t)!=EOF){printf("%lld\n",n*fastPower(2,t)%1000000007);}return 0;
}
快速幂 详解(转载): 快速幂算法(全网最详细地带你从零开始一步一步优化)_扬俊的小屋-CSDN博客