**浙大PAT甲级 1103 dfs+快速幂

来源:互联网 发布:可信的网络兼职 编辑:程序博客网 时间:2024/06/06 00:42

题目的意思是求一个数n=k个数的p次方之和。

对n进行深度优先搜索,按照递减的顺序进行搜索,并计算sum的值,如果sum的值比maxxx大,则更新vector,并用ans来统计结果次数,如果为0,那么输出impossible。

还用了快速幂来求解数的P次方。

AC代码:

#include<iostream>#include<map>#include<cstdio>#include<algorithm>#include<queue>#include<cstring>#include<set>#include<stack>#include<cmath>#include<vector>#include<hash_map>#define ll long long#define inf 24*60*60using namespace std;int n;int k,p;int maxxx=0;int ans=0;vector<int> v;vector<int> v1;int pow1(int x,int n){    int ans=1,tmp=x;    while(n)    {        if(n&1)        {            ans*=tmp;        }        tmp*=tmp;        n>>=1;    }    return ans;}void dfs(int x,int ci,int maxx,int sum){    if(x==0&&ci<k)    {        return;    }    if(x<0)    {        return;    }    if(ci==k)    {        if(x==0)        {            ans++;            if(sum>maxxx)            {                maxxx=sum;                v1=v;            }        }        return;    }    else    {        for(int i=maxx;i>=1;i--)        {            v.push_back(i);            dfs(x-pow1(i,p),ci+1,i,sum+i);            v.pop_back();        }    }}int main(){    scanf("%d %d %d",&n,&k,&p);    dfs(n,0,(int)pow(n+1,1.0/p),0);    if(ans==0)    {        printf("Impossible");        return 0;    }    printf("%d = ",n);    for(int i=0;i<v1.size();i++)    {        if(i==0)        printf("%d^%d",v1[i],p);        else        {            printf(" + %d^%d",v1[i],p);        }    }}


0 0
原创粉丝点击