我想从Hackerrank解决Project Euler+ #97。该问题要求计算A x B ** C + D
的最后12位数字。我尝试使用来自Wikipedia的模幂运算mod 10 ** 12
以有效计算最后12位数字并避免溢出。但是,除了样本2 x 3 ** 4 + 5
之外的所有情况,我都会出错。根据约束条件,unsigned long long
不应该溢出。项目欧拉+#97模块指数不起作用
问题:
现在,我们要学习如何计算这样的大数目的一些最后的数字。假设我们有很多数字A x B ** C + D
,我们想知道这些数字的最后12位数字。
约束:
- 1≤:T≤500000
- 1≤A,B,C,d≤10 ** 9
输入:第一行包含一个整数T - 测试次数。 T行跟随每个包含4个整数(A,B,C和D)。
输出:输出恰好一行包含正好12位数字 - 所有结果总和的最后12位数字。如果总和小于10 ** 12
那么打印相应数量的前导零。
我用C尝试
#include <stdio.h>
int main() {
const unsigned long long limit = 1000000000000;
int cases;
for (scanf("%d", &cases); cases; --cases) {
// mult = A, base = B, exp = C, add = D
unsigned long long mult, base, exp, add;
scanf("%llu %llu %llu %llu", &mult, &base, &exp, &add);
base = base % limit;
while (exp) {
if (exp & 1) {
mult = (mult * base) % limit;
}
exp >>= 1;
base = (base * base) % limit;
}
printf("%012llu\n", (mult + add) % limit);
}
return 0;
}
'(mult * base)%limit'真的吗?不是'((mult%limit)*(base%limit))%limit'或者什么? –
你允许使用64b整数算术吗?如果是这样,那么你不能只计算每个模2^64的值,并使用64b累加器来添加它们?然后使用“%012ld”格式模拟您的答案10^12和printf? – jschultz410
@WillNess:这是没有必要的,因为无论何时'mult'乘法,结果在最后减少模极限;同样''基' –