學軍信友隊趣味網路邀請賽 D 抗疫鬥爭

2022-03-06 21:54:33 字數 2422 閱讀 1515

時間限制:\(2000ms\)

空間限制:\(512mb\)

新冠疫情爆發以來,病毒不斷地擴散傳播,而人類也在不斷採取各種措施遏制病毒傳播。於是我們可以為這場抗疫鬥爭建立乙個數學模型,將病毒的不斷傳播和人類的不斷採取措施抽象為一場雙方輪流行動的博弈。我們認為人類與病毒的每輪行動都可以選擇乙個正整數作為行動值來評估。然而,出於各方面限制,雙方的所有行動值總和必須等於乙個數\(m\),且每次的行動值不能超過對方上輪的行動值。對人類來說,要遏制疫情,就應成為最後行動的一方,也就是說,在本方的某次行動後,行動值總和\(m\)恰好被消耗完。

假設人類先行動,那麼我們只需一鼓作氣消耗完所有 \(m\)點行動值,就能戰勝病毒。然而在最開始的階段出於認識不到疫情的嚴重性,往往最難開展大規模行動。出於這個原因,我們令\(h_m\)表示在行動值總和為\(m\)的情況下,人類(即先行動方)的第一次行動最少要多少行動值,才能保證自己必勝。

出於統計需要,某科學家記\(f_i=\sum_h_m\),並想知道\(\sum_^n f_i\)。方便起見,對\(998244353\)取模。你能幫個忙嗎?

第一行輸入乙個數\(n\)。

一行乙個數,表示答案。

\(3\)

\(6\)

本題採用子任務形式評測。

子任務編號

\(n<=\)

分值\(1\)

\(3\)

\(1\)

\(2\)

\(1000\)

\(9\)

\(3\)

\(10^5\)

\(31\)

\(4\)

\(10^\)

\(28\)

\(5\)

\(5*10^\)

\(26\)

\(6\)

\(10^\)

\(5\)

對於所有資料,滿足\(1<=n<=10^\)。

我們可以算出規律\(h_m=lowbit(m)\)

\(s(n)=\sum_^n\sum_h_m=\sum_^nh_m\lfloor\frac\rfloor\)

之後我們就可以計算\(h_m\)的前\(n\)項和然後分塊去做,但這樣只能通過到任務4

#includeusing namespace std;

typedef long long ll;

const int mod = 998244353;

ll work(ll n)

int main()

printf("%lld\n",(ans+mod)%mod);

return 0;

}

我們考慮列舉\(h_m\)的取值,並統一計算其貢獻。

\(h_m=lowbit(m)=2^k\)的貢獻為:\(2^k(\frac+\frac+\frac+...)\),因為這部分多算了後面\(2^,2^,...\)的貢獻,所以後面部分算的時候要減掉已經算過的,所以只需乘以\((2^k-2^)\)

比如:\[h_m=2^0的貢獻:2^0*(\frac+\frac+\frac+...)

\]\[h_m=2^1的貢獻:2^1*(\frac+\frac+\frac+...)

\]\[h_m=2^2的貢獻:2^2*(\frac+\frac+\frac+...)

\]因為\(1,3,5,7...\)這樣不好算

所以我們可以這樣去算

\[2^0*(\frac+\frac+\frac+...)=2^0*\sum_\lfloor\frac\rfloor

\]但這樣的話後面的就在這裡多算了\(2^0\)次,所以後面乘的值就要減掉前面的。

\[(2^1-2^0)*(\frac+\frac+\frac+..)

\]這裡也多算了後面的,所以算後面時也要減掉

\[(2^2-(2^1-2^0)-2^0)*(\frac+\frac+\frac+..)

\]\[=(2^2-2^1)*(\frac+\frac+\frac+..)

\]......

所以最後就等於

\[2^0*\sum_\frac+\sum_(2^k-2^)\sum_\lfloor\frac\rfloor

\]\[令g(n)=\sum_\lfloor\frac\rfloor

\]\[s(n)=g(n)+\sum_(2^k-2^)g(\frac)

\]

#includeusing namespace std;

typedef long long ll;

const int mod = 998244353;

ll g(ll n)

return res;*/

ll res=0;

ll p=sqrt(n);

for(ll i=1;i<=p;i++)res=(res+n/i)%mod;

return (2*res-p*p)%mod;

}int main()

學軍信友隊趣味網路邀請賽 B 齊心抗疫

給你一棵每條邊均為1的樹,求任意兩點距離乘兩端點中大的那個數的乘積最大為多少?題意轉化為公式就是求dis x y m ax a x a y dis x y max a x a y dis x y max a x a y 那麼難點就在於求任意兩點間的距離了。這時候要抓住條件 這是一棵樹!利用樹的直徑的...

杭州學軍中學信友隊「趣味網路邀請賽」遊記

活動 杭州學軍中學信友隊 趣味網路邀請賽 公告 學軍信友隊趣味網路邀請賽,登入 共設5題。由學軍中學信友隊在校五個國家集訓隊員精心原創出題。分5種型別題 a b c d e,從淺至深編排。每題均為100分。a型題 要求掌握條件結構 迴圈結構 陣列 遞迴等程式設計基礎知識,入門級水平 b型題 要求掌握...

杭州學軍中學信友隊 趣味網路邀請賽 總結

2019年末,新型冠狀病毒疫情爆發 數以千計的生命溘然長往 但是我們同舟共濟 鐘 聲激越,決勝千 李 事不避難,捨我其誰 在抗疫英雄們的帶領下 在偉大人民的奮鬥中 建起了堅實的壁壘,扼住了疫情的咽喉 清明之際,向 投身於新冠病毒抗爭中的戰士和烈士們 致敬by xj 總的來說,這次比賽有點尬。t1t2...