C++ 快速冪
快速冪就是在普通冪運算的基礎上儘量減少乘法運算的次數:
例如(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());
}
}
}