給定n,k,求多少個n的排列在經過以下計算後得到k:
n≤1000000 且為奇數
直接算不好算,可以轉化成:結果是大於等於k的減大於等於k+1的。
然後把大於等於k的數看成1,小於k的看成0。繼續挖掘有什麼性質。
把每一層看成去掉第
一、最後的位置,在草稿紙上手玩一下,可以發現:
1. 如果原序列中間的數是1,且兩邊有乙個1,那麼答案一定是1
2. 如果原序列中間的數與兩邊的不同,那麼向兩邊擴充套件(要一直保證對稱且相鄰元素不同)。例如:01010101011,得到的是1
那麼可以列舉對稱的部分有多大,然後用組合數計算未確定的部分
注意判邊界
時間複雜度o(
n)
#include
#include
#include
using namespace std;
const int n=1000005,mo=998244353;
typedef long long ll;
int n,m,fac[n],inv[n],f_inv[n],ans;
int c(int n,int
m)int calc(int
m) ans=(m==n/2+1);
for (int i=1;i<=n/2;i++)
}ans=(ll)ans*fac[m]%mo
*fac[n-m]%mo;
return ans;
}int main()
ans=calc(n-m+1)-calc(n-m);
if (ans<0) ans+=mo;
printf("%d\n",ans);
return
0;}
GDOI2017模擬第二輪 4 15 4 17
round 1 4.15 今天發揮。不好不差吧,一般般,基本沒有失分,但是相對的也沒有爆分。原以為t3可以搞一波大事情結果wa了,其實我拍出錯了但是並不知道 錯了,肉眼調不出錯,又是大資料,我小資料全對,就是大資料炸了,很不爽。第乙個小時拿來看題目。感覺t1是神題,先放著。t2的話,打表的分數挺多啊...
GDOI2017模擬第二輪總結
這場一上來就開始想t1,想了一段時間還是沒什麼思路,然後剛t3,感覺bitset可做。但是後面發現bitset只能處理空降而不能處理移動,於是就趕緊先打了乙個60分暴力。t2打表水了60,然後t4打了乙個20分暴力。還剩下1.5h回過頭來做t1,打了一半發現有問題,最後只好打30分暴力。主要是t1思...
gdoi2017四輪模擬最後總結
由於太急導致題目沒看清楚,碼了錯的暴力,這個非常虧,做了無用功。mle不用說,太貪心想打多點暴力分,結果空間開大了,直接爆零得不償失。想法不夠精簡,導致實現起來十分困難,浪費的時間沒拿到應有的分。細節沒考慮好,明明注意到了細節,處理了卻沒處理好。有想法卻看漏條件,導致出了偏差,想到並實現了錯誤的方法...