题意:
就是给你一个数字n,然后依次减去1,2,3,…如果恰好减到0就退出,如果不够减的就再加上n,从1开始减,问你一共重复了几次再加上n这个操作。当然刚开始就算一次操作。如果无解就输出impossible。
思考:
刚开始看了这个题目感觉直接模拟,看看最少啥时候可以退出,但是肯定会卡你。然后我感觉没有无解的情况,其实考虑清楚之后。当我们减到b,现在手上还剩a,a不够减b的那么再加上n,这样操作以后剩下的会变成2a,3a…,所以现在就是问你,多少a-b==0。这样还不太明显,因为不一定就非要加到b这个数字,实际上在减的过程中。只要达到xa%b==0就肯定在某次就等于0了。所以就是求a和b的最小公倍数,然后再除以a,看看要多少个a才够。
其实这种题目,对于操作次数的,经常会考gcd有关的性质。
代码:
int T,n,m,k;
int va[N];
signed main()
{
IOS;
cin>>T;
while(T--)
{
cin>>n;
int l = 1,r = n;
while(l<r)
{
int mid = l+r+1>>1;
if(mid*(mid+1)/2<=n) l = mid;
else r = mid-1;
}
int a = n-l*(l+1)/2,b = l+1;
if(a==0) //注意这里特判一下,否则下面出现除0的情况。
{
cout<<1<<"\n";
continue;
}
int now = a*b/__gcd(a,b)/a;
cout<<now<<"\n";
}
return 0;
}
总结:
多多积累经验呀。