模运算
为什么需要求余数
基本的模运算
计算除以m的余数
对m取模
以m为模
快速幂运算
反复平方法
Carmichael Numbers
算法提高 快速幂
题目
问题描述
给定A, B, P,求(A^B) mod P。
输入格式
输入共一行。
第一行有三个数,N, M, P。
输出格式
输出共一行,表示所求。
样例输入
2 5 3
样例输出
2
数据规模和约定
共10组数据
对100%的数据,A, B为long long范围内的非负整数,P为int内的非负整数。
解法1(不完全正确)
package 快速幂;
import java.util.Scanner;
public class 快速幂 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
long a=sc.nextLong();
long b=sc.nextLong();
long p=sc.nextLong();
System.out.println(mod_pow(a,b,p));
}
public static long mod_pow(long x,long n,long mod){
if(n==0)
return 1;
long res=mod_pow(x*x%mod,n/2,mod);
if((n&1)==1)
res=res*x%mod;
return res;
}
}
解法2(不完全正确)
package 快速幂;
import java.util.Scanner;
public class 快速幂 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
long a=sc.nextLong();
long b=sc.nextLong();
long p=sc.nextLong();
System.out.println(fastPower(a,b,p));
}
public static long fastPower(long a,long b,long mod){
long ans=1;
while(b!=0){
if((b&1)==1)
ans=ans*a%mod;
a=a*a;
b=b>>1;
}
return ans;
}
}
满分
package 快速幂;
import java.util.Scanner;
public class 快速幂 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
long a=sc.nextLong();
long b=sc.nextLong();
long p=sc.nextLong();
System.out.println(fastPower(a,b,p));
}
public static long fastPower(long a,long b,long mod){
long ans=1;//这里是1
a%=mod;//这里要除模,必须要,要不然知识40分
while(b!=0){
if((b&1)==1)
ans=ans*a%mod;//这里是乘以a哟
a=a*a%mod;//这里注意要除模,这里也还是必须的,要不然40分
b=b>>1;
}
return ans;
}
}