消减整数【lcm】

题目

https://ac.nowcoder.com/acm/contest/10746/F

分析

假设 (frac{(k+1)k}{2}leq n < frac{(1+(k+1))(k+1)}{2}),且 (m=n-frac{(1+k)k}{2})。每当不够减时,就要加一个 (m) ,直到达到 (m)(k+1) 的倍数,且 (n) 相当于已经加了一个 (m) 。因此,答案为:(frac{lcm(m,k+1)}{k+1})

代码

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int l=1,r=1e8;
        while(l<=r)
        {
            int mid=(l+r)>>1;
            if(1LL*(1+mid)*mid/2>n) r=mid-1;
            else l=mid+1;
        }
        ll a=1LL*(1+r)*r/2;
        ll b=n-a;
        if(b==0) printf("1
");
        else
            printf("%lld
",1LL*(1+r)/__gcd(b,1LL*r+1));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/1024-xzx/p/14409826.html