Perm排列計數

2022-03-17 01:25:41 字數 1482 閱讀 4538

記憶體限制:512 mib 時間限制:1000 ms 標準輸入輸出

題目描述

稱乙個1,2,...,n的排列p1,p2...,pn是magic的,當且僅當2<=i<=n時,pi>pi/2. 計算1,2,...n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值

輸入格式

輸入檔案的第一行包含兩個整數 n和p,含義如上所述。

輸出格式

輸出檔案中僅包含乙個整數,表示計算1,2,?, ???的排列中, magic排列的個數模 p的值。

樣例樣例輸入

20 23

樣例輸出

16

資料範圍與提示

100%的資料中,1 ≤ ??? n ≤ 106, p??? ≤ 10^9,p是乙個質數。 資料有所加強

題解

剛拿到這道題的時候沒什麼思路,但腦子啊有時候吧~~

可以把這個題想象成一棵二叉樹,下標即在排列中的位置,當然1為根

乙個點的任意乙個子孫一直除2的話最終都會到該點,即在以該點為根的子樹內,該點值最小  

假設有n個點,父親要最小的那乙個,左右兒子各自成家,互不干擾,左兒子要剩下的n-1個中的m個,剩下的都給了右兒子一家,組合數為c(n-1,m),向下乙個個分下去你會發現

轉移式為 f[爹]=f[左兒子]*f[右兒子]*c(size,size)  f表示滿足條件的組合數,size表示以該點為根的樹的大小  

因為n有點大,n!會炸掉,所以求組合數的時候上lucas定理就歐了

弱弱的lockey死活不用lucas(我牛逼,我偉大),一直在搞高精乘低精,高精除低精,但還是在強悍的lucas面前獻上了膝蓋%%%%

#include#include

using

namespace

std;

int n,p,son[110000000],d[100000000

];long

long ans=1

;long

long pow(long

long a,long

long b,long

long

p) ans%=p;

return

ans;

}long

long inv(long

long x,long

long

p)long

long c(long

long n,long

long

m)long

long lucas(long

long n,long

long m,long

long

p)void dfs(int

x)

return;}

intmain()

dfs(1);

cout

}

Perm 排列計數

題目描述 稱乙個1,2,n的排列p1,p2.pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值 輸入格式 輸入檔案的第一行包含兩個整數 n和p,含義如上所述。輸出格式 輸出檔案中僅包含乙個整數,表示計算1,2的排列...

Perm 排列計數

題目描述 稱乙個1,2,n的排列p1,p2.pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值 輸入格式 輸入檔案的第一行包含兩個整數 n和p,含義如上所述。輸出格式 輸出檔案中僅包含乙個整數,表示計算1,2,的排...

Perm排列計數(bzoj2111)

time limit 10 sec memory limit 259 mb submit 2686 solved 811 submit status discuss 稱乙個1,2,n的排列p1,p2 pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的...