快速幂就是在普通幂运算的基础上尽量减少乘法运算的次数:
例如(7^7)%4
可以看为
((7%4)^7)%4
(3^7)%4
(((3*3)%4)^6)%4
(1^6)%4
(1^(2*3))%4 // 就像将(7^16)变成(49^8)
(1^3)%4.......
下面是对应代码 :a为底数,b是指数,m是要准备取模的数
快速幂取模就是在快速幂的基础上每步取模!
long long Mode(long long a,long long b,long long m)
{
long long sum=1;
a=a%m;
while(b>0)
{
if(b%2==1)
{
sum=(sum*a); //sum=(sum*a)%m;
b--;
}
b/=2;
a=(a*a); //a=(a*a)%m;
}
return sum;
}
HDU2035
人见人爱A^B
Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
Sample Input
2 3 12 6 789 10000 0 0
Sample Output
8 984 1
明显需要快速幂的运算,但是题目要求只输出结果的最后三位数字,那么在每一步上对1000取模即可!
import java.util.*;
public class Main {
public static long fun(int n1,int n2) {
long sum=1;
while(n2>0) {
if(n2%2==1)
{
sum=(sum*n1)%1000;
}
n2/=2;
n1=(n1*n1)%1000;
}
return sum;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int n=sc.nextInt(),m=sc.nextInt();
if(n==0&&m==0)
break;
long ans=fun(n,m);
System.out.println(ans);
}
}
}
Tr A
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7502 Accepted Submission(s): 5490
Problem Decription
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
Output
对应每组数据,输出Tr(A^k)%9973。
Sample Input
2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
Sample Output
2 2686
矩阵快速幂就是在快速幂的基础上将整数相乘换为矩阵的乘法!
import java.util.Scanner;
//面向对象,创建一个矩阵类,包含其字段变量和要用的方法!
class matrix {
int n;
int mat[][]=new int [10][10];
matrix(int n) {
this.n=n;
}
public matrix mutiply(matrix b) { //矩阵乘法
matrix c=new matrix(n);
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
for(int k=0;k<n;k++) {
c.mat[i][j]+=mat[i][k]*b.mat[k][j];
c.mat[i][j]%=9973;
}
}
}
return c;
}
public void init() {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++)
{
if(i==j)
mat[i][j]=1;
else
mat[i][j]=0;
}
}
}
public long tr(){
long res=0;
int i;
for(i=0;i<n;i++)
res+=mat[i][i];
return res%9973;
}
}
public class Main {
static matrix fastpow(matrix a,int k) { //快速幂
matrix ans=new matrix(a.n); //整数计算初始ans为1,矩阵运算初始ans为单位矩阵!
ans.init();
while(k>0) {
if(k%2==1)
{
ans=ans.mutiply(a);
k--;
}
a=a.mutiply(a);
k/=2;
}
return ans;
}
public static void main(String[] args) {
int i,j;
int t,n,k;
Scanner cin=new Scanner(System.in);
t=cin.nextInt();
while(t-->0){
n=cin.nextInt();
k=cin.nextInt();
matrix ma=new matrix(n);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
ma.mat[i][j]=cin.nextInt();
}
}
System.out.println(fastpow(ma, k).tr());
}
}
}