牛客月赛31-消减整数-(数论+思维)

F

题意:
就是给你一个数字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;
}

总结:
多多积累经验呀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值