费马小定理:假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p)。即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
同余证法:
任意取一个质数,比如13。考虑从1到12的一系列整数1,2,3,4,5,6,7,8,9,10,11,12,给这些数都乘上一个与13互质的数,比如3,得到3,6,9,12,15,18,21,24,27,30,33,36。对于模13来说,这些数同余于3,6,9,12,2,5,8,11,1,4,7,10。这些余数实际上就是原来的1,2,3,4,5,6,7,8,9,10,11,12,只是顺序不同而已。
把1,2,3,…,12统统乘起来,乘积就是12的阶乘12!。把3,6,9,…,36也统统乘起来,并且提出公因子3,乘积就是312×12!。对于模13来说,这两个乘积都同余于1,2,3,…,12系列,尽管顺序不是一一对应,即312×12!≡12!mod 13。两边同时除以12!得312≡1 mod 13。如果用p代替13,用x代替3,就得到费马小定理xp-1≡1 mod p。
C~K的难题
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
众所周知 C~K 喜欢数学,但是他最近被一个题给难住了,题目是这样的。
要求 (A/B)%10007,但由于 A 很大,我们只给出 n (n = A%10007)(我们给定的A必能被B整除,且 gcd(B,10007) = 1)。
你能帮助他解答吗?他会很感谢你的。
Input
数据的第一行是一个 T,表示有 T 组数据。
每组数据有两个数 n (0 <= n < 10007) 和 B (1 <= B <= 10^9)。
Output
对应每组数据输出 (A/B)%10007。
Example Input
2
1000 53
87 123456789
Example Output
8893
7424
Hint
Author
「山东理工大学第一届ACM知识挑战赛(机试)」C~K
以下为Accepted代码
#include <bits/stdc++.h>
using namespace std;
long long power_mod(long long a, long long k, long long mod)///快速乘
{
long long ans = 1;
while(k)
{
if(k & 1)///k是奇数
ans = ans * a % mod;
a = a * a % mod;
k >>= 1;///k /= 2;
}
return ans;
}
const int mod = 10007;
int main()
{
int T;
long long n, b, x;
scanf("%d", &T);
while(T--)
{
scanf("%lld %lld", &n, &b);
x = power_mod(b, mod-2, mod);
printf("%lld\n", n * x % mod);///费马小定理
}
return 0;
}