F.消减整数(gcd)

考虑:

最后剩余的数为 m m m,此时下一个要减的数为 k k k, m < k m<k m<k,所以 + n +n +n下一次会剩余 2 m , 3 m … 2m,3m\dots 2m,3m…知道 x m ≥ k xm\ge k xm≥k,然后减去 k k k,又小于 k k k,所以最终目的就是求 m , k m,k m,k的 l c m lcm lcm。

x m = l c m ( m , k ) → x = l c m ( m , k ) m = k g c d ( m , k ) xm=lcm(m,k)\rightarrow x=\dfrac{lcm(m,k)}{m}=\dfrac{k}{gcd(m,k)} xm=lcm(m,k)→x=mlcm(m,k)=gcd(m,k)k

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
ll f(ll n){
return n*(n+1)>>1;
}
ll gcd(ll a,ll b){
return !b?a:gcd(b,a%b);
}
ll fun(ll n){
int l=1,r=n;
while(l<=r){
ll m=l+r>>1;
if(f(m)<=n) l=m+1;
else r=m-1;
}
return r;
}
int main(){
int t;scanf("%d",&t);
while(t--){
ll n;scanf("%lld",&n);
ll k=fun(n);
ll m=n-f(k);
if(!m) puts("1");
else k++,printf("%lld\n",k/gcd(k,m));
}
return 0;
}