唯一分解?还是诈骗?土豆片的歪门邪道C. Divisor Chain Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)

新的一周又有了新的专题,“简单数学”......(土豆片是没发现有哪里简单的),一个唯一分解定理已经把土豆片整麻了,白熊也自身难保。看看土豆片如何用不一样的思维ac数论题(完全跟数论不搭边的歪门邪道).......


题目:题目传送门

 

 

 

 


土豆片的歪门邪道(题目思考): 

虽然这是一道数论题,因为土豆片不会用唯一分解定理,所以他想用一些其他的方法来解决这个问题。

题目大意:

首先,题目大意是要让我们把一个数X减为1,选取x的一个除数d,将x变为x - d,即减少x为d。(若d为正整数,且存在整数q ,使得x = d⋅q ,则称d为x的除数。)还有一个额外的约束:不能两次以上选择相同的d值。乍一看感觉毫无头绪,再一看感觉跟唯一分解定理毫无关系。所以可以先分析一下条件。

分析:

题上对于x的处理方式比较特殊,将x减去一个x的因数,那么怎样能保证每次减去的都是他的因数捏?最简单粗暴的就是他本身,但是要是这样减的话就是直接减到0了,无法进行合理的控制,所以,土豆片想到了一个挺好挺好的想法——正着不行咱就倒着来,从1加到x!

看看这个想法是否可行,从 1开始加,要保证是因数那就一直加他本身,但是也会出现加出的值大于x的情况,所以,从1加到x,设一个tmp为上一次x的值,先每次加上tmp,如果大于x就加上tmp的一半,tmp保持不变;如果小于等于就加上tmp,tmp再更新这样就完美保证了对x的限制。并且也能保证不减去两个相同值。

例如第三个样例:14

从1开始的变化是:1->2->4->8->12->14分别加上了1,2,2,4,2(这一部分可以自己在草纸上验证一下比较直观)


高冷白熊的想法:

刚好白熊也在做这道题而且,他也不咋会唯一分解定理,高冷白熊跟土豆片一样想到了一种神奇的做法,从x开始减,若x为奇数则减一,若x为偶数就减去x的二分之一,听起来好像跟土豆片的差不多,也就是顺序改了一下,土豆片一时间也没看出来有什么不对甚至感觉这种做法更好。

但是白熊wa辣!这是有问题的!白熊又来求助正在跟椒盐粉玩的土豆片男神。土豆片经过严密思考想到了不对劲的地方,那就是特殊的1!白熊的想法会重复使用1这个因数。因为在最后时必定是2->1必定有一个-1,若x为奇数则在最开始必定有一个-1所以这个想法是不可行的。(要是让减为0倒是好像可行,但是这不直接减去x本身就行了.....)


土豆片的ac代码:

#include<bits/stdc++.h> 
#define int long long
using namespace std;

int s[1000002],num,tmp;

void bluechips()
{
	int x;
	cin>>x;
	num=0,tmp=1;
	s[num++]=tmp;
	int biao=tmp;
	while(tmp!=x)		//倒序从1开始加到x 
	{
		if(tmp+biao<=x)		//若相加后小于n则直接相加更新biao
		{
			tmp+=biao;
			biao=tmp;
			s[num++]=tmp;	//记录变化 
		}
		else		//若大于n则加二分之一biao后更新biao 
		{
			while(1)
			{
				biao/=2;
				if(tmp+biao<=x)
				{
					tmp+=biao;
					s[num++]=tmp;	//记录变化 
					break;
				}
			}
		}
	}
	cout<<num<<endl;
	for(int i=num-1;i>=0;i--)
	{
		cout<<s[i]<<" ";		//输出每一步记录 																																																																										土豆片最帅! 
	}
	cout<<endl;
}
signed main()
{
	int t;
	cin>>t;
	while(t--)
	{
		bluechips();
	}
	return 0;
}

土豆片跟白熊的想法可能是带一点小贪心?(反正不是唯一分解定理)

大佬可以讲讲咋用唯一分解这个正统方法写.......


完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bluechips·zhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值