代码中需要澄清以及基础数学是什么?

时间:2014-02-25 13:03:59

标签: c++ algorithm math

需要解决计算问题

a^b mod p where  a,b <= 10 ^ 100000
MOD = 1000000007

在每个测试用例中ab都是按照上述限制的数字字符串给出的。我尝试使用指数调制使用下面提到的代码来解决它。

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 

2 个答案:

答案 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。