2014新生暑假個人排位賽02 C goblin

2021-06-22 22:25:33 字數 1283 閱讀 4096

時間限制1000 ms

記憶體限制65536 kb

v輸入格式

輸入以eof為結束,每組僅含一行,兩個正整數 n, p。 3≤n≤4200,p≤10^9

對於每組資料輸出僅含一行,乙個非負整數,表示你所求的答案對 p 取餘之後的結果。

4 7

3

說明:共有 10 種可能的山脈,它們是:

1324 1423 2143 2314 2413

3142 3241 3412 4132 4231

題目大意:求1~n的排列中一大一小一大一小或者一小一大一小一大的數列數目(mod p) 1<=n<=10000

很牛*的遞推式:f[n][k]=f[n-1][n-k]+f[n][k-1] 初始條件是f[1][1]=1 照這個式子遞推,2*f[n][n]即為所求...網上大部分都這麼寫的...

其實這個f[n][k]表示1~n+1的排列中第一位是k+1且第二位比它小的數列數目(好多說是1~n第乙個是k的數目...)。

假設下乙個數字是k,那麼數目是第一位是k的開頭上公升序列,又因為第一位是第i個數的開頭下降序列是和第一位是倒數第i個數的上公升序列總是一一對應的,那麼k在剩下的數列中是倒數第(n-k+1)-1個數(多減一因為前面k用過了),這個數目即為f[n-1][n-k]。

如果下乙個數字不是k,那麼先生成乙個以k開頭的下降序列,把這個下降序列中k+1和k的位置換一下,同樣是乙個下降序列(因為k和k+1不挨著),這個數目為f[n][k-1]。

由此得到了那個遞推式...最後求出的f[n][k]中把第一位上的k+1拿掉,剩下的就是乙個上公升序列了,因為還有開頭下降的序列,這個數目*2就是答案。

#include #include #include #include #include #include #include #include #define eps 1e-5

#define maxn 4205

/*author birdstorm*/

using namespace std;

int dp[2][maxn];

int main()

int ans=0;

for(int i=1;i<=n;i++) ans=(ans+dp[m][i])%p;

printf("%d\n",(ans*2)%p);

}return 0;

}

總結 2014新生暑假個人排位賽02

時間限制1000 ms 記憶體限制65536 kb 丁神要去google上班了,去之前丁神想再做一道水題,但時間不多了,所以他希望題目做起來既水又快。如今一共同擁有 n道題,編號從1到 n,每道題有兩個值a和 b,a為做這道題須要的時間,b為題目的 水值 丁神希望做b a最大的那題。輸入第一行為資料...

2014新生暑假個人排位賽06

時間限制 3000 ms 記憶體限制 65536 kb 小弱的學校很喜歡修路,現在給你一張他學校的地圖,地圖上有n個點和m條雙向邊,每條邊代表一條路,這條路有可能是暢通,也有可能正在修路。大家都知道修路使得交通很不方便。所有小弱很想學校快快的把路修好,使得他能夠很輕鬆的到達主樓915去刷題。但考慮到...

2014新生暑假個人排位賽08

時間限制 1000 ms 記憶體限制 65536 kb 小弱發明了乙個好玩的遊戲,遊戲開始時給你乙個凸多邊形,這個多邊形可以任意旋轉,平移。讓你造出乙個正方形 容器 足夠大 容器的兩邊垂直,兩邊水平。用這個容器把這個多邊形完全包含,且多邊形有且只有一條邊恰好與容器下邊界重合 與外界相通 不同的邊與外...