【发布时间】:2016-10-05 04:37:12
【问题描述】:
如何用 1 计算 (xy) mod z 1000 和 z 任意正整数 1 31 ?
到目前为止,我所做的是: 将 x 和 y 扫描为字符串,取模,然后计算 (xy) mod z。
我知道这是错误的,因为 (xy) mod z 不等于 ((x mod z)(y mod z)) mod z。那我该如何解决呢?
编辑:抱歉,我在创建问题时将 x 和 y 的底部约束设置得如此之高。我只是想把其他焦点放在大整数问题上,而不是模幂:)。
#define MOD z
long long power (long long k, long long n) {
if (n == 1) return k;
else {
long long p = power (k, n/2);
if (n % 2 == 0) return (p * p) % MOD;
else return (((p * p) % MOD) * k) % MOD;
}
}
long long convert (char *n) {
long long number = 0;
int ln = strlen (n);
for (int x = 0; x < ln; x++) {
number = number * 10;
number = (number + (n[x] - '0')) % MOD;
}
return number % MOD;
}
int main () {
char s_x[1111], s_y[1111];
scanf ("%s %s", s_x, s_y);
long long x, y, r;
x = convert (s_x);
y = convert (s_y);
r = power (x, y);
printf ("%lld\n", r);
}
【问题讨论】:
-
K*x % x 始终为 0。设置 K = pow(x, y-1) 没有任何改变。
-
我想你的意思可能是 pow(x,y)%z,而不是 pow(x,y)%x。
-
对不起。错字。已编辑。
-
@RonaldSumbayak 你应该明确
z的范围。显示x和y而不是z的范围很奇怪。至少有一个答案假设了一定的范围,大大简化了问题,而且你没有澄清这个假设是否正确。请edit您的问题澄清这一点。 -
好的,谢谢。已编辑。
标签: c modulus exponentiation