DFS 水题 Help Dexter

来源:互联网 发布:免费刷空间人气软件 编辑:程序博客网 时间:2024/06/01 12:13
入以整数T(≤300)开始,表示测试用例数。


每种情况从两个整数开始:p q(1≤p,q≤17)。


输出

对于每种情况,首先打印案例编号。那么你必须找到两个整数(最小和最大),它们有p位,可以被2的q次方整除。整数应该只包含1和2。如果没有找到结果,打印“不可能”。如果只有一个整数,则打印该整数。否则打印由单个空格分隔的两个整数(首先是最小的一个,然后是最大的)。

样例输入
3
2 2
2 1
2 3


样例输出
案例1:12
情况2:12 22

情况3:不可能

思路:DFS,1.需要注意下用long long 

                      2.符合情况的可能性较多,所以可以将存储符合条件的数组大些

#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;typedef long long ll;ll k,num[10000005],mul;int t,p,q;void DFS(ll cnt,ll sum){     sum=sum*10+1;    cnt++;    //printf("%lld %lld\n",cnt,sum);    if(cnt==p){        if(sum%mul==0){          num[k++]=sum;        }    }    else{        DFS(cnt,sum);    }    cnt--;  sum=sum/10;     sum=sum*10+2;    cnt++;    //printf("%lld %lld\n",cnt,sum);     if(cnt==p){       if(sum%mul==0){               num[k++]=sum;              return ;       }    }    else{        DFS(cnt,sum);    }}int main(){    scanf("%d",&t);    for(int icase=1;icase<=t;icase++)    {         scanf("%d%d",&p,&q);        k=1;        mul=(ll)pow(2,q);        DFS(0,0); k--;        sort(num+1,num+k+1);         printf("Case %d: ",icase);        if(k==0)            printf("impossible\n");        else if(k==1)            printf("%lld\n",num[1]);        else if(k>=2)            printf("%lld %lld\n",num[1],num[k]);     }    return 0;}

原创粉丝点击