需要解决计算问题
a^b mod p where a,b <= 10 ^ 100000
MOD = 1000000007
在每个测试用例中a
和b
都是按照上述限制的数字字符串给出的。我尝试使用指数调制使用下面提到的代码来解决它。
typedef long long ll;
ll modPow(ll base, ll exp, ll n) {
base = base%n;
if (exp == 0)
return 1;
else if (exp == 1)
return base;
else if (exp % 2 == 0)
return modPow(base * base % n, exp / 2, n);
else
return base * modPow(base, exp - 1, n) % n;
}
int main() {
ll test, i, j , k;
string a, b;
ll x, y, ans;
cin >> test ;
while ( test-- ) {
cin >> a >> b;
x = 0;
for (i = 0; i < a.length(); i++)
x = (x * 10 + (a[i] - '0')) % MOD;
y = 0 ;
for (i = 0 ; i < b.length(); i++)
y = (y * 10 + (b[i] - '0')) % (MOD - 1);
// cout << x <<" "<< y << endl;
ans = modPow(x, y, MOD);
cout << ans % MOD << endl ;
}
}
我只想在计算指数值y
时知道,为什么我们已经完成了
for (j = 0; j < b.length(); j++)
y = ( ( y * 10 ) + ( b[i] - '0') ) % (MOD-1); // gave correct answer
而不是
for (j = 0; j < b.length(); j++)
y = ( ( y * 10 ) + ( b[i] - '0') ) % (MOD); // gave wrong answer
任何人都可以澄清并解释它背后的数学吗?
Sample Test Case :
INPUT :
5
3 2
4 5
7 4
34534985349875439875439875349875 93475349759384754395743975349573495
34543987529435983745230948023948 3498573497543987543985743989120393097595572309482304
OUTPUT :
9
1024
2401
735851262
985546465
答案 0 :(得分:3)
根据Fermat's little theorem的概括,
a b mod p = a b mod(p-1) mod p
答案 1 :(得分:1)
这是因为 a ^ b mod N 的周期(最多)长度 N - 1。
2^n mod 5 --> 1 2 4 3 | 1 2 4 3 | 1 2 4 3 | ... (cycle of 4 with n = 0 ... 11)
3^n mod 7 --> 1 3 2 6 4 5 | 1 3 2 6 4 5 | ... (cycle of 6)
因此,a ^ b mod N = a ^(b mod(N-1))mod N。