快速乘法 快速冪

2021-08-09 08:48:14 字數 1740 閱讀 2359

description

從 n 個不同元素中任取 m(m≤n)個元素,按照一定的順序排列起來,叫做從 n

個不同元素中取出 m 個元素的乙個排列。當 m=n 時所有的排列情況叫全排列。

你覺得 xxy 會問你全排列的個數嗎?xxy:這個問題能淹死你,我才不問呢。我

要問的是求 n 的全排列中,先遞增後遞

減、先遞減後遞增的全排列的個數。由於答案可能很大,對 p 取餘

input

輸入包含多組測試資料每組測試

資料一行兩個整數 n,p

output

對於每組測試資料輸出一行表示答案

3 5

42 233

0hint

設資料組數為 t

對於 10%的資料,n<=10,p<=1000,t=1

對於另外 10%的資料,n<=12,p<=1000,t<=12

對於另外 10%的資料,n<=100,p<=100000,t<=100

對於另外 10%的資料,n<=100000,p<=1000000,t=1

對於另外 10%的資料,n<=100000,p<=1000000,t<=1000

對於另外 20%的資料,n<=1e9,p<=1e9,t<=1000

對於 100%的資料,n<=1e18,p<=1e18,t<=1000

找規律 

對於3 我們可以找出所有情況 

1 3 2

2 3 1

2 1 3

3 1 2

我們可以發現 4的所有遞增遞減的情況一定是基於3的所有情況 

1 3 2   我們可以將4放在 3前面 1 4 3 2 或者 放在3後面 1 3 4 2 

其他情況相同 n全排列的單峰情況 一定可以由n-1的單峰排列情況推出 

共2的n次方種

但這不是全部  

還有特殊情況 1 2 3  -->1 2 4 3

-->4 1 2 3   

3 2 1  -->3 4 2 1

-->3 2 1 4   

共 2n+4種

2n用快速冪和快速乘即可

1 #include 2 #include 3 #include 4

5 typedef long

long

ll;6

7using

namespace

std;89

intt;

1011

ll n,p;

1213 inline void read(ll&x)

1920

inline ll quick_plus(ll b,ll k)

27return ans%p;28}

2930

inline ll quick_pow(ll a,ll k)

37return

ans;38}

3940

inthh()

48 ll ans=quick_pow(2

,n);

49 ll l=4-p;

50 ans=(ans-l+p)%p;

51 printf("

%lld\n

",ans);52}

53return0;

54}5556

int sb=hh();

57int main(int argc,char**argv)

**

乘方快速冪 OR 乘法快速冪

關於快速冪這個演算法,已經不想多說,很早也就會了這個演算法,但是原來一直靠著模板雲裡霧裡的,最近重新學習,發現忽視了乙個重要的問題,就是若取模的數大於int型,即若為 int64的時候應該怎麼辦,這樣就得用到乘法快速冪 乘方快速冪了。快速冪一般是為了解決乘方取模問題的,顯然思想就是二分,下面貼上快速...

快速冪乘法

原創作者 by 夜 深 感謝作者 在 上一直沒有找到有關於快速冪演算法的乙個詳細的描述和解釋,這裡,我給出快速冪演算法的完整解釋,用的是c 語言,不同語言的讀者只好換個位啦,畢竟讀 c的人較多 所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去...

快速冪,矩陣乘法,矩陣快速冪

快速冪利用二進位制 複雜度 log級 include include include include using namespace std typedef long long ll typedef unsigned long long ull int q power int a,int b,int...