求冪方法-pow函式
也就是平常使用pow函式,最簡單的實現就是一直累乘,可以得到這樣的**:
123
4567
int pow(int a,int n)
return ans;
}
快速冪取模
根據同餘定理,我們知道
(ab)%m = ((a%m)(b%m))%m;
其實快速冪取模也是用到這個定理,
那麼根據上面的定理可以推導出另乙個定理:
(a^b) mod c = (a a a……..)%c = ((a%c)(a%c)(a%c)*………)%c = (a%c)^b %c;
這就是快速冪取模
123
4567
891011
12
typedef long long ll; // 視資料大小的情況而定
ll powermod(ll x, ll n, ll m) 計算a^n % m
return res;
}
這另乙個有什麼區別???
123
4567
891011
1213
14
typedef long long ll;
ll mod;
ll qpow(ll a, ll n)//計算a^n % mod
return re % mod;
}
矩陣快速冪
實現矩陣快速冪的一種方法如下
123
4567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
50
struct matrix//定義乙個結構體,方便傳遞值;/*
maxn和mod由全域性定義,其中mod根據需要可以省去
*/matrix mat_multi(matrix a, matrix b)//矩陣求積}}
return ans;
}matrix mat_quickpow(matrix a, int n)//矩陣快速冪
}while(n != 0)//方法與普通快速冪相同,只有乘法的實現不同
return ans;
}
快速冪問題
所謂的快速冪,實際上是快速冪取模的縮寫 首先,最基本的辦法是 int ans 1 for int i 1 i b i ans ans c ans是對answer的縮寫但是如果a很大,那麼a b的結果就容易非常大,所以在求之前可以先對a做乙個變化 如下 int ans 1 a a c 加上這一句 fo...
快速冪問題
求a b mod p 首先讓計算機求出a b,如果直接暴力的話,計算機要計算b次,但是b的資料範圍太大,直接計算可能會超時,所以要採用快速冪,將複雜度降為o log b 這樣表示之後,我們就可以在快速冪的過程中讓a不斷的自乘 看下 ll power int a,int b,int p return ...
快速冪問題
求 a 的 b 次方對 p 取模的值。輸入格式 三個整數 a,b,p 在同一行用空格隔開。輸出格式 輸出乙個整數,表示a b mod p的值。資料範圍 0 a,b,p 109 資料保證 p 0 輸入樣例 3 2 7輸出樣例 2快速冪思想 如果我們想求37是多少,用最暴力的做法只需要迴圈進行7次相乘,...