同步
原題鏈結
簡要題意:一開始你有 n
nn 瓶快樂水,每擁有1
11 瓶快樂水就可以附帶 n
nn 個物件,第 i
ii 個物件有了 a
ia_i
ai 個就可以再獲得 1
11 瓶快樂水。不允許借代 / 賒賬,求最多得到的快樂水的瓶數,如果是無限多則輸出 inf
\text
inf.
這是洛谷一道月賽題的 t1t1
t1.首先,本人賽時並沒有想很多,當時只想著: t1t1
t1應該是水模擬吧,可是當時仔細想:m=5
m = 5
m=5 萬一死迴圈陷入環內,怎麼辦?萬一 inf
\text
inf 情況判不出來,怎麼辦?萬一被卡出 tle
\text
tle 怎麼辦?
但是我不心慌,決定一一解決。
實則真正意義上的模擬,是那種一眼看起來就是模擬水題,然後直接亂髮過掉的,而不是通過一定量思考發現可以模擬解決再過掉的,本題被評為橙題是不應該的,不應該。
死迴圈陷入環內這一問題是最棘手的。但是仔細想:每次你得到的快樂水瓶數隻會越來越多,越來越多,從來不存在少的情況。如何判斷結束呢?乙個快樂水也衍生不出來就可以結束了。
那麼如何判斷無限情況呢?很顯然,無限當且僅當所有 a
ia_i
ai 相等 且 ai≤
na_i \leq n
ai≤
n.為什麼呢?因為,如果所有 a
ia_i
ai 都相等並且第一次可以衍生的話,首先之後每次操作 a
ia_i
ai 都相等,然後每次衍生出的 m
mm 個都會再產生,再產生 ⋯
⋯\cdots \cdots
⋯⋯所以是無限的,具體不懂可以看看樣例。
這一切都解決之後,我們想一想 tle
\text
tle 問題該怎麼辦?
可是你想想,真會 tle
\text
tle 麼?
我們需要構造一組資料使得借和還的次數最多!
這裡美妙優秀的 wyxkk
\text
wyxkk
出題人給出了一組美妙無比的 hack
\text
hack
資料:
10000 5
2 3 7 43 1807
其構造方法在於,ai=
(∏j=
1i−1
aj)+
1a_i = \big( \prod_^ a_j \big) + 1
ai=(∏
j=1i
−1a
j)+
1,並且 ai=
2a_i = 2
ai=2.
經過實測,這個資料會達到 2.8×1
07
2.8 \times 10^7
2.8×10
7 次!(答案達到 3×1
010
3 \times 10^
3×1010
,需要部分開啟 long long
\text
long long
)當然如果 m=6
m=6m=
6 模擬就無力解決啦。
時間複雜度:o
(wys
)o(\text)
o(wys)
.(大概很優秀吧)
實際得分:100pt
s100pts
100pts
.
#pragma gcc optimize(2)
#include
using
namespace std;
inline
intread()
int x=0;
while
(ch>=
'0'&& ch<=
'9') x=x*
10+ch-
'0',ch=
getchar()
;return x*f;
}int n,m;
long
long ans=0;
int a[6]
,b[6
],c[6]
;long
long l;
bool x=0;
//無限情況
inline
void
check()
//當前瓶數為 b , a 是初始陣列 , l 記錄多出來的瓶數
intmain()
//做標記if(
!f)//如果 c[i] = b[i] 則說明一次之後根本沒變 , 是無限情況}if
(x)printf
("inf");
else
printf
("%lld\n"
,ans)
;return0;
}
P1057 傳球遊戲(DP水題)
上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 nn個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師再次吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個...
P1346電車 最短路水題
在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口 不排除有的觀光軌道轉一圈後返回路口的可能 在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另...
P1338 末日的傳說 水題
只要是參加jsoi活動的同學一定都聽說過hanoi塔的傳說 三根柱子上的金片每天被移動一次,當所有的金片都被移完之後,世界末日也就隨之降臨了。在古老東方的幻想鄉,人們都採用一種奇特的方式記錄日期 他們用一些特殊的符號來表示從1開始的連續整數,1表示最小而n表示最大。創世紀的第一天,日曆就被賦予了生命...