文章

4139

粉丝

129

获赞

184

访问

646w

头像
涂颜色 题解:欧拉定理/费马小定理降幂+快速幂
P2015 上海交通大学机试题
发布于2025年1月24日 17:44
阅读数 68

这题容易发现规律,每一行有2种涂法(交叉式的涂),而跟有多少列没有关系。
所以ans = 2^n%mod;
由于n特别大,所以这题重点就是高精度的计算。
高精度的 幂并且取模运算 会想到用 欧拉定理降幂+快速幂。
对于欧拉定理,有个欧拉函数:
定义:
在数论中,对于一个正整数n,欧拉函数是 小于等于n 的正整数中 与n互质的数 的数目(φ(1)=1)。

欧拉定理的公式理解:
对于互质数a,m, a 的 m的欧拉值 次幂 对m取模 与 1对m取模 同余(三横这里是同余的意思)
费马小定理可以看成欧拉定理的一种特殊情况,即m为质数,对m取模时,m的欧拉值为m-1;
那么如何运用欧拉定理来降幂呢?

我们用欧拉定理的特殊情况费马小定理来举例:

2^100 % 7  = (2^(6*16)) * (2^4)  % 7 =(1^16) * (2^4) % 7 = 2;
同样上面那个例子套入降幂公式:
A = 2;
B =100;
C = 7;
2^100 % 7 = 2^(100%φ(7)+ φ(7)) % 7;
φ(7) = 6;
2^100 % 7 = 2^(100%6+ 6) % 7 = 2^(4+6) % 7 = 2^4 % 7 * 2^6 % 7 = 16%7*1 = 2;

与测试结果一致:

解题:
由于mod = 1e9 + 7,
是一个质数,所以对于本题来说可以直接用费马小定理+快速幂
或者不管mod是不是质数(没有考虑到mod是不是质数),用欧拉定理+快速幂;
幂指数n十分十分大,用前先结合同余定理处理

(费马+快速幂):

#include <iostream>
#include <string>
#define ll long long
const ll mod = 1e9+7;
using namespace std;
ll quickPow(ll a,ll b)
{
    ll ans = 1;
    a %= mod;
    while(b)
    {
        if(b&1) ans = (ans * a) % mod;
        a = a * a ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发