报错代码:
long long res;
res = pown(3,a-1) * 4 % 1000000007;
理论上pown返回的int值无论乘多少,取余1000000007后的结果都不会超过int范围。
但是这里报了一个859813556 * 4超出int表示范围的错误。个人猜测是因为运行时遇到int*int的情况,内部会开一个临时的int变量用于存放结果,然后再去取余再去赋值给res,所以这里res设置成long long也没用,因为是在pown(3,a-1) * 4这一步溢出的和其他无关。
解决办法:
res = pown(3,a-1);
res *= 4;
res %= 1000000007;
拆开分步运算,这样运算就都在res这个long long的空间中,不会溢出。