快速冪問題

2021-10-02 23:14:33 字數 1503 閱讀 4531

求冪方法-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次相乘,...