次方求模 nyoj 102 快速冪

2021-06-20 21:35:42 字數 1424 閱讀 9852

以下截自百科:

快速冪顧名思義,就是快速算某個數的多少次冪。

其時間複雜度為 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取餘之後的結果

樣例輸入

3

2 3 5

3 100 10

11 12345 12345

樣例輸出

3

110481

這個題多了一步取模。

利用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 高次...