以下截自百科:
快速冪顧名思義,就是快速算某個數的多少次冪。
其時間複雜度為 o(log2n), 與樸素的o(n)相比效率有了極大的提高。
以下以求a的b次方來介紹:
把b轉換成2進製數
該2進製數第i位的權為a^(2^(i-1))
例如a^11=a^(2^0+2^1+2^3)
11的二進位制是1 0 1 1
11 = 2^3*1 + 2^2*0 + 2^1*1 + 2^0*1
因此,我們將a^11轉化為算a^(2^0)*a^(2^1)*a^(2^3)
**:
#include int pow (int a, int b)
base *= base;
//printf("base = %d\n", base);
b /= 2;
} return r;
}int main (void)
return 0;
}
位運算:
#include /*
base一直自乘,等於a^1, a^2, a^4, a^8…………
如果b&1是1的話,就乘上base
是0就不乘
*/ int pow (int a, int b)
base *= base;
b >>= 1;//右移一位
} return r;
}int main (void)
return 0;
}
上面兩種寫法,位運算更快一些。看完快速冪就找了乙個題做一做
時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:3 描述
求a的b次方對c取餘的值
輸入
第一行輸入乙個整數n表示測試資料的組數(n<100)
每組測試只有一行,其中有三個正整數a,b,c(1=
輸出輸出a的b次方對c取餘之後的結果
樣例輸入
32 3 5
3 100 10
11 12345 12345
樣例輸出
3110481
這個題多了一步取模。
利用a * b % c = ((a % c) * b) % c
#include long long pow(long long a, long long b, long long c)
l = l * l % c;
b >>= 1;
//r %= c;
} return r;
}int main (void)
return 0;
}
nyoj 102 次方求模(快速冪)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述求a的b次方對c取餘的值 輸入第一行輸入乙個整數n表示測試資料的組數 n 100 每組測試只有一行,其中有三個正整數a,b,c 1 輸出輸出a的b次方對c取餘之後的結果 樣例輸入 3 2 3 5 3 100 10 11 12345...
NYOJ 102 次方求模 快速求冪
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 求a的b次方對c取餘的值 輸入 第一行輸入乙個整數n表示測試資料的組數 n 100 每組測試只有一行,其中有三個正整數a,b,c 1 輸出輸出a的b次方對c取餘之後的結果 樣例輸入 3 2 3 5 3 100 10 11 123...
NYOJ 102 次方求模
描述 求a的b次方對c取餘的值 輸入 第一行輸入乙個整數n表示測試資料的組數 n 100 每組測試只有一行,其中有三個正整數a,b,c 1 輸出輸出a的b次方對c取餘之後的結果 樣例輸入 3 2 3 5 3 100 10 11 12345 12345 樣例輸出 3 110481 include 高次...