712的n次方,结果后三位为696,满足这个条件的n的个数为多少?(0 < n < 24767)
这是一个典型的模幂算法问题,下面证明: (a * b) % n = [(a % n) * (b % n) ] % n (把*换成+也成立)
设 a = k1*n + r1, b = k2*n + r2,
于是有:
(a * b) % n = ( k1*k2*n*n + k1 * r2 * n + k2 * r1 * n + r1 * r2 ) % n = (r1 * r2 ) % n = [(a % n) * (b % n) ] % n.
根据上面证明有(a^b) % n = ( (a%n) * (a^(b-1)) % n ) % n
下面给出模幂运算的递归和非递归代码:
#include<iostream>
using namespace std;
int getMod1(int a, int b, int n)
{
if(0 == b)
return 1;
return (a % n * getMod1(a, b - 1, n))%n;
}
int getMod2(int a, int b, int n)
{
int i, r = 1;
for(i = 1; i <= b; i++)
{
r = ( (r % n) * (a % n) ) % n;
}
return r;
}
int main()
{
int a = 3;
int b = 4;
int n = 5;
cout << getMod1(a, b, n) << endl;
cout << getMod2(a, b, n) << endl;
int i, r, sum = 0;
a = 712;
n = 1000;
r = 696;
for(i = 1; i < 24767; i++)
if(r == getMod2(a, i, n))
sum++;
cout << sum << endl;
return 0;
}