UVA - 10396(简单暴力)

来源:互联网 发布:数据接口大全 编辑:程序博客网 时间:2024/06/08 11:06

直接暴a,然后dfs可行b,求b时如果中间值超过上限则要剪枝

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <map>#include <set>using namespace std;int max_[3]= {9999,999999,99999999};int lim[3] = {2,3,4};int st[3] = {10,100,1000};int ed[3] = {99,999,9999};int mi[3][10]={{0,10,1},{0,100,10,1},{0,1000,100,10,1}};int cnt[10];set<int> vis[3];void inline cal(int n,int f){  int tn = n;  while(tn){     cnt[tn%10]+=f;     tn/=10;  }}void dfs(int p,int sum,int a,int I){  if(p == lim[I]+1){     memset(cnt,0,sizeof(cnt));     int b = sum/a;     cal(sum,1); cal(b,-1); cal(a,-1);     for(int i=0;i<=9;i++) if(cnt[i]!=0) return ;     if( !(sum&1) ){     vis[I].insert(sum);     }     return ;  }  int st=0;  if(p == 1 || (p==lim[I]&&a%10==0) ) st++;  for(int i=st;i<=9;i++){     if(sum+a*i*mi[I][p]<=max_[I]){         dfs(p+1,sum+a*i*mi[I][p],a,I);     }  }}int main(){   for(int i=0;i<3;i++){      for(int j=st[i];j<ed[i];j++){          dfs(1,0,j,i);      }   }   int n;   while(scanf("%d",&n)==1&&n){      int p ;      if(n==4) p=0;      else if(n==6) p=1;      else p = 2;      for(set<int>::iterator it=vis[p].begin();it!=vis[p].end();it++){          printf("%d\n",*it);      }      printf("\n");   }}


0 0