题目描述
牛牛有一个正整数x,牛牛需要把数字x中的数位进行重排得到一个新数(不同于x的数),牛牛想知道这个新数是否可能是原x的倍数。请你来帮他解决这个问题。
输入描述:
输入包括t+1行,第一行包括一个整数t(1 ≤ t ≤ 10), 接下来t行,每行一个整数x(1 ≤ x ≤ 10^6)
输出描述:
对于每个x,如果可能重排之后变为自己的倍数输出"Possible", 否则输出"Impossible".
示例1
输入
2 14 1035
输出
Impossible Possible
生成所有可以组成的数。及全排列问题,排除自身不变的情况
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool solve(int x, vector<int> &v, int pos)
{
if(pos >= v.size())
{
int temp = 0;
for(int i = v.size() - 1; i >= 0; i--)
{
temp = temp * 10 + v[i];
}
if(temp % x == 0 && temp / x > 1)
return true;
return false;
}
for(int i = pos; i < v.size(); i++)
{
if(i != pos && v[i] == v[pos])
continue;
swap(v[i], v[pos]);
if(solve(x, v, pos + 1))
return true;
swap(v[i], v[pos]);
}
return false;
}
int main()
{
int n;
cin >> n;
while(n--)
{
int x;
cin >> x;
int temp = x;
vector<int> v;
while(temp)
{
v.push_back(temp % 10);
temp /= 10;
}
if(solve(x, v, 0))
cout << "Possible" << endl;
else
cout << "Impossible" << endl;
}
return 0;
}