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 #include78#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....