1 条题解

  • 0
    @ 2026-9-30 12:57:32

    C++ :

    
    #include <cstdio>
    /* 段长 L(>=2)首项 a = (M - L(L-1)/2) / L,要求整除且 a >= 1。
       L 越大 a 越小,故按 L 从大到小枚举即得首项升序。 */
    int main(){
        long long M;
        if(scanf("%lld", &M) != 1) return 0;
        long long Lmax = 1;
        while((Lmax + 1) * Lmax / 2 < M) Lmax++;
        for(long long L = Lmax; L >= 2; L--){
            long long rest = M - L * (L - 1) / 2;
            if(rest % L) continue;
            long long a = rest / L;
            if(a >= 1) printf("%lld %lld\n", a, a + L - 1);
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    2818
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者