看題目的Hint 圖形就知道題意了,對著圖形,稍微觀察一下就會發現,每一層需要的卡牌數目為 2 * n + (n - 1)個,然後大致就有個思路,暴力枚舉,但是僅僅這樣沒法子枚舉,這個公式 只代表其中一層,不可能對每一層都枚舉吧,可以化簡一下 公式就是 3 * n - 1,這樣就會發現 每次差1就是3的倍數了,然後每一層都差1,如果有i層的話,那麼其實就是差了i,這樣就很容易想到了,假設共有卡牌 x張,其實 就是枚舉 i ,有多少個i 使得 (x + i)%3 == 0,這樣就簡單了,但是還有個限制的,因為 搭建i層 至少需要的牌數要知道,布恩那個超過x張,這裡又得多畫畫找找,後來發現 搭建i層 至少需要 (3 * i + 1)* i/2張卡牌,這樣 就很容易確定枚舉范圍了,而且 答案不大,所以直接枚舉答案沒事
題目鏈接:戳這裡
做完覺得有點取巧,萬一答案很大不就完了,於是乎去看看別人怎麼做的,發現了更好的方法,其實 每一層 差1 就是3的倍數,那麼相當於,每一層減去2就是3的倍數,這樣就不是 枚舉 (x + i)%3 == 0了,可以往下 枚舉 (x - 3 * (j - 1) - 2 * j)%3 == 0;這樣就不用考慮上限了,減少了找公式的時間
ll n; void init() { } bool input() { while(cin>>n) { return false; } return true; } void cal() { ll ans = 0ll; for(ll k = 1;;k++) { if(n < (3 * k + 1) * k / 2) break; if((n + k)%3 == 0)ans++; } cout<