emmmmmmmmmmmmmm,这已经是我第二次写这道题了,虽然看见了之后还是一脸蒙蔽……完全没有思路啊,wtf??
然后,我就看了我之前的的代码,嗯。。
首先让我们来捋一捋思路,这道题应该是一道dfs,为什么呢,深度搜索,确定了指数之后,你要继续分解,所以说是dfs最恰当不过的了,如何dfs呢??
有两种情况
1.你分解的这个数恰好是2的幂次方;
2.这个数不是2的幂次方,最后结果会是若干个多项式相加的结果。
还有一个问题,括号,你要怎么处理??
将括号分开,前半部分和后半部分,中间继续递归。
#include<iostream>
using namespace std;
int n,p[20]={};
void work(int k)
{
if(k==1) {printf("2(0)");return ;}
if(k==2) {printf("2");return ;}//处理最终值,因为最后只能是2或2(0)或2(2)的形式
int t;
bool flag=true;
for(int i=1;;i++)
{
if(p[i]>k) {t=i-1;break;}//如果是有多个累加的,那么此时flag还是true
else if(p[i]==k) {t=i;flag=false;break;}//如果正好是2的次方,那么此时flag也就是false
}
if(flag==false) {printf("2(");work(t);printf(")");}
else
{
printf("2");
if(t!=1)//t=1时就是可以直接输出2
{
printf("(");
work(t);
printf(")");//最后前面的全部递归出来之后,才执行这一步
}
printf("+");
work(k-p[t]);//在处理剩下的部分
}
}
int main()
{
scanf("%d",&n);
p[0]=1;
for(int i=1;i<=15;i++)
p[i]=p[i-1]*2;//利用数组搜索2次幂,因为数据一共就20000,所以可以有一个预处理
work(n);
return 0;
}
注意捋清关系,什么时候要输出什么,多模拟几遍;距离noip还有359天,相信自己