Vampire Numbers UVA - 10396

问题

https://vjudge.net/problem/UVA-10396

分析

找到v=x*y
要求:
v分别是4位,6位,8位
v是偶数
x,y不能同时0为结尾
x,y的两个数字混合在一起,可以得到v

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
typedef long long LL;
const int maxn=100000+5;
int n,Left[]={10,100,1000},Right[]={100,1000,10000},lim[]={1000,100000,10000000};
set<int> ans[3];

inline bool check(int v,int x,int y,int num){
    int d[10],k=(num<<1);
    for(int i=0;i<10;++i) d[i]=0;
    for(int i=0;i<num;++i){
        ++d[x%10];
        ++d[y%10];
        x/=10;
        y/=10;
    }
    for(int i=0;i<k;++i){
        --d[v%10];
        v/=10;
    }
    for(int i=0;i<10;++i){
        if(d[i]!=0) return false;
    }
    return true;
}

void solve(){
    for(int i=0;i<3;++i){
        int down=Left[i],up=Right[i],l=lim[i];
        for(int x=down;x<up;++x){
            for(int y=x;y<up;++y){
                if((x&1) && (y&1)) continue;
                if(x%10==0 && y%10==0) continue;
                int v=x*y;
                if(v<l) continue;
                if(check(v,x,y,2+i)) ans[i].insert(v);
            }
        }
    }
}

int main(void){
    solve();
    while(scanf("%d",&n)==1) {
        int t=0;
        if(n==4) t=0;
        else if(n==6) t=1;
        else t=2;
        for(auto iter=ans[t].begin();iter!=ans[t].end();++iter) {
            printf("%d\n",*iter);
        }
        printf("\n");
    }
    return 0;
}
发布了180 篇原创文章 · 获赞 3 · 访问量 3453

猜你喜欢

转载自blog.csdn.net/zpf1998/article/details/105054937