PAT——1103 Integer Factorization 甲级(dfs+剪枝+快速幂,超详细注解)
作者:互联网
1103 Integer Factorization
题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224
题意
需要说明的是,从1到n的数字的p次方只要小于等于n,就都有可能曾为目标因子,而非传统的因子概念
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,k,p,maxfacSum=-1;
vector<int> v,ans,tans;
int Pow(int a,int b)//快速幂
{
int ans=1,base=a;
while(b)
{
if(b&1) ans*=base;
base*=base;
b>>=1;
}
return ans;
}
void init()//v中每一个下标index对应了facmaxSum中的一个加数index^p
{
int tmp=0,index=1;
while(tmp<=n)
{
v.push_back(tmp);
tmp=Pow(index,p);
index++;
}
}
void dfs(int index,int tSum,int tK,int facSum)
//深搜,四个参数分别为v的下标,临时的因子p次方的和,因子数,因子和
{
if(tK==k)//第一个条件
{
if(tSum==n&&facSum>maxfacSum)
{
ans=tans;
maxfacSum=facSum;
}
return;
//注意,在满足因子数为k的第一个条件后,无论因tSum是否等于n都要返回,
//因为在tSum+1后,下一次dfs一定不符合条件了 ,以节省开销
}
while(index>=1)
{
if(tSum+v[index]<=n)//剪枝的判断条件,大于n当前index就一定不可能满足条件
{
tans[tK]=index;
dfs(index,tSum+v[index],tK+1,facSum+index);
}
if(index==1) return;//返回条件
index--;
}
}
int main()
{
scanf("%d %d %d",&n,&k,&p);
init();
tans.resize(k);
dfs(v.size()-1,0,0,0);
if(maxfacSum==-1)//没有符合条件的答案
{
printf("Impossible");
return 0;
}
printf("%d = ",n);
for(int i=0;i<ans.size();i++)
{
if(i) printf(" + ");
printf("%d^%d",ans[i],p);
}
}
参考
1103. Integer Factorization (30)-PAT甲级真题(dfs深度优先)
标签:剪枝,PAT,tSum,int,index,Factorization,因子,dfs,ans 来源: https://blog.csdn.net/ljhsq/article/details/120615623