整理手刷代码
快速幂 和 64位乘法取模
题意
求 a 的 b 次方对 p 取模的值,其中 0 ≤ a, b, p ≤ 1e9
输入描述:
三个用空格隔开的整数 a, b 和 p。
输出描述:
一个整数,表示a^b mod p 的值
示例输入
2 3 9
示例输出
8
题解
没啥好说的,简单代码直接上
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll ksm(ll a, ll b, ll mod){
if(!b) return 1 % mod;
int ret = 1;
while(b){
if(b & 1) ret = (ret * a) % mod;
b >>= 1;
a = (a * a) % mod;
}
return ret;
}
int main(){
ll a, b, m;
while(~scanf("%lld%lld%lld",&a,&b,&m)){
printf("%lld\n",ksm(a, b, m));
}
return 0;
}
题意
求 a 乘 b 对 p 取模的值,其中 0 ≤ a, b, p ≤ 1e18
输入描述:
第一行a,第二行b,第三行p。
输出描述:
一个整数,表示a × b mod p 的值
示例输入
2 3 9
示例输出
6
题解
没啥好说的,和上面一样简单代码直接上
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll ksc(ll a, ll b, ll mod){
if(!b) return 1 % mod;
ll ret = 0;
while(b){
if(b & 1) ret = (ret + a) % mod;
b >>= 1;
a = (a << 1) % mod;
}
return ret;
}
int main(){
ll a, b, m;
while(~scanf("%lld%lld%lld",&a,&b,&m)){
printf("%lld\n",ksc(a, b, m));
}
return 0;
}