新的一周又有了新的专题,“简单数学”......(土豆片是没发现有哪里简单的),一个唯一分解定理已经把土豆片整麻了,白熊也自身难保。看看土豆片如何用不一样的思维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;
}
土豆片跟白熊的想法可能是带一点小贪心?(反正不是唯一分解定理)
大佬可以讲讲咋用唯一分解这个正统方法写.......
完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。