消减整数【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\n");
        else
            printf("%lld\n",1LL*(1+r)/__gcd(b,1LL*r+1));
    }
    return 0;
}

上一篇:poj2977:生理周期


下一篇:Beautiful numbers CodeForces - 55D