bzoj 4402 Claris的劍 組合數學

2022-05-18 06:08:49 字數 1553 閱讀 4753

time limit: 10 sec  memory limit: 256 mb

submit: 375  solved: 213

[submit][status][discuss]

claris想要鑄一把劍,這把劍必須符合他的審美,具體來說,我們可以把這把劍的不同地方的寬度看成乙個序列,這個序列要滿足以下條件:

1.每個元素都是正整數(你的寬度不可能是負數吧)

2.每個元素不能超過m,太寬了如果比claris身高還高怎麼辦(你可以認為claris的身高就是m)

3.相鄰兩個元素的差的絕對值必須是1(如果是0,則這個地方不是鋸齒,殺傷力不夠,如果太大,又太醜了)

4.第乙個元素的值必須是1(劍尖必須是最窄的地方)

他想知道有多少把長度不超過n(即寬度的序列長度不超過n)的合法的本質不同的劍。

我們認為兩把劍本質不同,當且僅當存在至少乙個寬度,在兩把劍的寬度序列裡面出現次數不一樣。

比如和是本質相同的

和則是本質不同的

只有兩個整數,表示n,m (資料保證$n,m \leq 2000000$)

只有乙個整數,表示答案對$10^9+7$取模的結果

5 39

樣例解釋

所有本質不同的合法的劍有如下:

1 #include2 #include3 #include4 #include5 #include6 #include7

8#define mod 1000000007

9#define n 2000007

10using

namespace

std;

11 inline int

read()

1215

while(isdigit(ch))

16return x*f;17}

1819

intn,m,lim;

20long

long

ans,mul[n],inv[n];

2122

long

long c(int n,int

m)23

30int

main()

3134 lim=max(n,m)+10

;35 mul[0]=1;inv[1]=1;inv[0]=1;36

for (int i=1;i<=lim;i++) mul[i]=mul[i-1]*i%mod;

37for (int i=2;i<=lim;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;

38for (int i=1;i<=lim;i++) inv[i]=inv[i]*inv[i-1]%mod;

39 lim=min(m-2,n-2

);40

for (int i=0;i<=lim;i++)

4147 ans=(ans-(lim+1)+min(n,m))%mod;

48 ans=(ans+mod)%mod;

49 printf("

%lld\n

",ans);

50 }

BZOJ 4402 Claris的劍 組合數學

由於存在集合等價的情況,我們就只考慮字典學最小的方案 假設最大值是ma x 那麼構造出的序列有兩種情況 1,2,1,2,1,2.3,2 3,2 3.ma x 2,max 1,ma x 2,max 1.ma x 1,2,1,2,1,2.3,2 3,2 3.ma x 2,max 1,ma x 2,max...

BZOJ4402 Claris的劍(組合數學)

這裡放傳送門 這題比較關鍵的一點就是注意到題目裡說兩把劍本質不同當且僅當存在一種數字的出現次數不同。也就是說這個東西跟數字的出現順序是無關的。那麼我們可以考慮確定一種排序方式讓每一種本質不同的解都唯一對應一種看起來比較好做的序列。因為每兩個元素相差必須是1,通過多畫幾個試試觀察可以發現每一種合法解都...

bzoj4402 Claris的劍(組合數學)

傳送門 思路 考慮怎麼才不會算重。顯然你的序列可以變化成 121 2.xx 1xx 1.ma x1 2 1 2.x x 1 x x 1.max 1212.xx 1xx 1.max和12 12.xx 1xx 1.ma xmax 1 1 2 1 2.x x 1 x x 1.max max 1 1212....