1. 程式人生 > 實用技巧 >題解 SP26368 【PWRANDMOD - Power and Mod】

題解 SP26368 【PWRANDMOD - Power and Mod】

實際發表時間:2020-04-16
https://www.luogu.com.cn/problem/SP26368

不想用龜速乘的看這裡來!!!

前兩篇題解用的都是__int128,但是相乘時又會爆__int128,又不想用龜速乘,怎麼辦呢?
我們注意到,資料範圍都是正整數,所以我們可以使用無符號的__int128——__uint128_t!
然後讀入使用快讀,輸出用快寫,冪運算用快速冪即可
但是NOIP不能用...5555

程式碼:

#include<bits/stdc++.h>
#define int __uint128_t //原來忘記用了
using namespace std;

inline int read() //快讀
{
    int s=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+ch-48;
        ch=getchar();
    }
    return s;
}

inline void write(int x) //快寫
{
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10^48);
}

inline int qp(int x,int y,int mod) //快速冪
{
    int res=1;
    while(y)
    {
        if(y&1)res=res*x%mod;
        y>>=1;
        x=x*x%mod;
    }
    return res;
}

unsigned a,b,t; //unsigned運算好像比signed運算快
int m;

signed main()
{
    t=read(); //讀入t
    while(t--)
    { //操作
        a=read(),b=read(),m=read();//讀入a,b,m
        write(qp(a,b,m)),puts(""); //輸出
    }
    return 0;
}