1. 程式人生 > 其它 >常用的 JavaScript 方法封裝

常用的 JavaScript 方法封裝

https://zhuanlan.zhihu.com/p/131536831

#include <bits/stdc++.h>
using namespace std;
bool large_enough = false; // 判斷是否有b >= phi(m)
inline int read(int MOD = 1e9 + 7) // 快速讀入稍加修改即可以邊讀入邊取模,不取模時直接模一個大於資料範圍的數
{
    int ans = 0;
    char c = getchar();
    while (!isdigit(c))
        c = getchar();
    while (isdigit(c))
    {
        ans = ans * 10 + c - '0';
        if (ans >= MOD)
        {
            ans %= MOD;
            large_enough = true;
        }
        c = getchar();
    }
    return ans;
}
int phi(int n) // 求尤拉函式
{
    int res = n;
    for (int i = 2; i * i <= n; i++)
    {
        if (n % i == 0)
            res = res / i * (i - 1);
        while (n % i == 0)
            n /= i;
    }
    if (n > 1)
        res = res / n * (n - 1);
    return res;
}
int qpow(int a, int n, int MOD) // 快速冪
{
    int ans = 1;
    while (n)
    {
        if (n & 1)
            ans = 1LL * ans * a % MOD; // 注意防止溢位
        n >>= 1;
        a = 1LL * a * a % MOD;
    }
    return ans;
}
int main()
{
    int a = read(), m = read(), phiM = phi(m), b = read(phiM);
    cout << qpow(a, b + (large_enough ? phiM : 0), m);
    return 0;
}

  

另一個證明方式,其求得是a^b Mod M

#include <iostream>
#include <cstdio>

using namespace std;

int a,b,m,temp,phi,ans=1;
bool flag;

int main()
{
    int i;
    char c;
    
    scanf("%d%d",&a,&m);
    
    temp=phi=m;
    
    for (i=2;i*i<=m;++i) //計算phi
    {
        if (temp%i==0)
        {
            phi=phi-phi/i;
            while (temp%i==0)
            {
                temp/=i;
            }
        }
    }
    if (temp>1)
    {
        phi=phi-phi/temp;
    }
    
    while (!isdigit(c=getchar())); //邊讀入b邊取模
    for (;isdigit(c);c=getchar())
    {
        b=b*10+c-'0';
        if (b>=phi)
        {
            flag=true;
            b%=phi;
        }
    }
    if (flag) //只有b>=phi時才b+=phi
    {
        b+=phi;
    }
    
    for (i=20;i>=0;--i) //快速冪,不是必需的
    {
        ans=1ll*ans*ans%m;
        if (b&(1<<i))
        {
            ans=1ll*ans*a%m;
        }
    }
    
    cout<<ans;
    
    return 0;
}