1 条题解

  • 0
    @ 2025-10-3 14:51:48

    iji\ge j 时

    ij+1=m\lfloor\frac{i}{j}\rfloor+1 = m m1njj<mm-1\le \frac{n-j}{j}\lt m (m1)jnj<mj(m-1) j \le n-j\lt mj (m1)j+jn<mj+j(m-1) j + j \le n\lt mj+j mjn<(m+1)jmj\le n\lt (m+1)j nm+1<jnm\frac{n}{m+1}\lt j\le \frac{n}{m} $$\lfloor\frac{n}{m+1}\rfloor\lt j\le \lfloor\frac{n}{m}\rfloor$$

    i<ji\lt j 时

    0+ji=m0+\lceil\frac{j}{i}\rceil = m m1<niimm-1\lt \frac{n-i}{i}\le m (m1)i<njmi(m-1) i \lt n-j\le mi (m1)i+i<nmi+i(m-1) i + i \lt n\le mi+i mi<n(m+1)imi\lt n\le (m+1)i $$\lceil\frac{n}{m+1}\rceil \le i\lt \lceil\frac{n}{m}\rceil$$

    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    void work()
    { 
        int n, m;
        cin >> n >> m;
        if (m > n || m == 1)
        {
            cout << "0\n";
            return;
        }
        if (m == n - 1 || m == n)
        {
            cout << "1\n";
            return;
        }
        int ans = 0;
        ans += (n / m) - (n / (m + 1));                             // 两个下取整
        ans += ((n + (m - 1)) / m) - ((n + (m + 1 - 1)) / (m + 1)); // 两个上取整
        cout << ans << "\n";
        return;
    }
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int T;
        cin >> T;
        while (T--)
            work();
        return 0;
    }
    
    • 1

    信息

    ID
    113
    时间
    1000ms
    内存
    125MiB
    难度
    9
    标签
    (无)
    递交数
    100
    已通过
    9
    上传者