題目描述
牛牛有一個正整數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;
}