1355: 排列组合

题目描述

PIPI现在有一个正整数num , PIPI想把num中的数位进行排列组合得到一个新数(该新数不能等于num),PIPI想知道这个新数是否可能是原数的倍数。
例: 123 重排之后能够得到 132 213 231 312 321

输入

输入第一行包括一个正整数T(T<=100),代表测试样例组数。
接下来每一行输入一个正整数num (1<=num<=1e9)

输出

对于每个数字num,如果重排之后有可能变成自己的倍数,从小到大输出所有的倍数(换行输出, 指每两个数之间有个换行)。否则输出"Impossible"。

样例输入

2
15
1035

样例输出

Impossible
3105

#include<bits/stdc++.h>
using namespace std;
const int N=15;
bool vis[N];
int ans[N];
int str[N];
int n,k,num,flag;
vector<int>vt;
unordered_map<int,bool>mp;
void dfs(int now)
{
    if(now==k)
    {
        int sum=0;
        for(int i=0; i<k; i++)
            sum=sum*10+ans[i];
        if(mp.count(sum)) return;
        mp[sum]=1;
        if(sum%num==0&&sum!=num)
        {
            flag=1;
            printf("%d\n",sum);
            return;
        }
    }
    for(int i=0; i<k; i++)
    {
        if(!vis[i])
        {
            vis[i]=1;
            ans[now]=str[i];
            dfs(now+1);
            vis[i]=0;
        }
    }
}
int main()
{
    memset(vis,0,sizeof(vis));
    scanf("%d",&n);
    while(n--)
    {
        mp.clear(); ///别忘记mp.clear啊啊啊啊
        flag=0;
        scanf("%d",&num);
        int value=num;
        k=0;
        while(value)
        {
            str[k++]=value%10;
            value=value/10;
        }
        sort(str,str+k);
        dfs(0);
        if(flag==0)
            printf("Impossible\n");
    }
}
发布了78 篇原创文章 · 获赞 7 · 访问量 4584

猜你喜欢

转载自blog.csdn.net/weixin_44433678/article/details/104232234