CF938E Max History 組合數學

2022-05-28 16:03:07 字數 753 閱讀 4256

這題目最原始的想法我們先對序列排序,發現每個數的貢獻其實就是先找到比他小的數的個數記為cnt

然後列舉這個數所在的位置,之後就可以從cnt中選j-1個填到前面,然後還要進行排列

但是這樣超過了複雜度,所以我們考慮優化這個組合數表示式,首先是簡單的約分

約後,我們發現上下兩個階乘中間的數相減就是乙個常數,如果遇到這種情況,可以在外面乘上這個常數的階乘,然後求和裡面除掉。就能把求和變成乙個組合數

根據楊輝三角變化,就能變成乙個可以直接計算的答案了

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int n=1e6+10

;const ll mod=1e9+7

;ll a[n];

ll qmi(ll a,ll b,ll mod)

return res%mod;

}int

main()

sort(a+1,a+1+n);

ll ans=0

;

intj;

for(i=1;i<=n;i=j)

cout

return0;

}

view code