费马小定理和例题 逆元的应用

费马小定理:假如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 

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值