• 【模板】费马小定理


    C~K的难题:费马小定理+快速幂

    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。

    Sample Input

    2
    1000 53
    87 123456789
    

    Sample Output

    8893
    7424
    

    费马小定理: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p) 两边都mod p;
    即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。

    取余操作的加减乘除:

    [(a+b)\%p=(a\%p+b\%p)\%p ]

    [(a-b)\%p=(a\%p-b\%p)\%p ]

    [(a*b)\%p=((a\%p)*(b\%p))\%p ]

    [(a/b)\%p=(a*b^{-1}\%p)\%p ]

    [(a^b)\%p=((a\%p)^b)\%p ]

    延伸公式1:

    [(n*a^{p-1})\%p=n\%p ]

    延伸公式2:

    [(a^{p-2})\%p=a^{-1}\%p ]

    延伸公式3:

    [a^b\%p=a^{b\%(p-1)}\%p ]

    题目解法:k=A/B

    [(A/B)\%p=k\%p ]

    [=k*B^{p-1})\%p ]

    [=(A*B^{p-2})\%p ]

    [=[(A\%p)*(B^{p-2})\%p]\%p ]

    [=[n*(B^{p-2})]\%p ]

    第二行:延伸公式1的逆用,只要公式里的a与p互质即可,因为题目中的B与p互质,所以可以用题目中的B来代替公式中的a。

    第三行:把k化简开,化成A/B

    第四行:取余乘法的分配律

    代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ll long long
    
    int qmi(ll a, ll b, ll mod) {   //快速幂
    	ll flag = 1;
    	while (b) {
    		if (b & 1)flag = (flag*a) % mod;
    		a = (a*a) % mod;
    		b = b >> 1;
    	}
    	return flag%mod;
    }
    
    int main() {
    	int t, n, b,mod=10007;
    	cin >> t;
    	while (t--) {
    		cin >> n >> b;
    		cout << n*qmi(b, mod-2, mod) % mod << "
    ";
    	}
    	return 0;
    }
    
  • 相关阅读:
    STM32|4-20mA输出电路
    Delphi版IP地址与整型互转
    侧方位停车
    98年的‘风暴’,08年的‘危机’,18年的“钱荒‘’
    一些软件设计的原则
    oracle-数据库的各种-锁-详解
    演员李艾佳去世突发病征年仅36岁
    【人生】王石:没变强是因为你太舒服
    耐心看的人早晚会成人上人
    Linux之make的用法讲解
  • 原文地址:https://www.cnblogs.com/52dxer/p/13822787.html
Copyright © 2020-2023  润新知