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...