ZJANS

b594. A Marvelous Pet

Medium Last Update: 2026/01/16
cpp

Mark 吃的東西成等差數列,其中公差 d=1d = 1
給一個數字 n 為 Mark 吃的總和
求投餵的方法數


解法一、窮舉

🔹 等差數列

窮舉等差數列長度 kk,計算 a1a_{1}
如果 a1a_{1} 是正整數則這是一個有效的方法:cnt++

另外,首項最小值是 1
因此如果 a1<1a_{1} < 1,就可以提前 break

首項計算公式

等差數列求和公式:s=k(2a1+d(k1))2s = \frac{k(2a_{1} + d(k-1))}{2}

  • a1a_{1} 為首項
  • dd 公差
  • kk 為項數

— — —

其中,總和為 nnd=1d = 1

k(2a1+k1)2=n\frac{k(2a_{1} + k - 1)}{2} = n
2a1+k1=2nk\Rightarrow 2a_{1} + k - 1 = \frac{2n}{k}
a1=2nkk+12\Rightarrow a_{1} = \frac{\frac{2n}{k} - k + 1}{2}

✅ 完整代碼

評分結果(參考) : AC (1ms, 340KB)

#include<bits/stdc++.h>
#define int long long
using namespace std;

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    while(true) {
        cin >> n;
        if(n == 0) break;
        
        int cnt = 0;
        for(int k=2; k<n; k++){
            double a1 = (2.0*n/k - k + 1)/2;
            if(a1 < 1) break;
            if(a1 == (int)a1) cnt++;
        }
        
        cout << cnt << "\n";
    }
    
    return 0;
}