直接深搜+检验。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #define mkp make_pair using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=1050,INF=0x7FFFFFFF; int n,tot; vector<int> vct; int getr(vector<int> &x,int pos) { int res=0; for(int i=0;i<3;++i) { res+=x[pos]*x[i]*pow(10,i)+0.5; } return res; } bool chk(int x,int dgt) { int std=pow(10,dgt)+0.5; if(x>=std)return 0; for(;x;) { if(find(vct.begin(),vct.end(),x%10)==vct.end())return 0; x/=10; } return 1; } void dfs(vector<int> &x) { if(x.size()==5) { int res1=getr(x,3); int res2=getr(x,4); int res=res1+res2*10; if(chk(res1,3)&&chk(res2,3)&&chk(res,4)) { //cout<<res1<<" "<<res2<<" "<<res<<endl; ++tot; } return; } for(int i=0;i<vct.size();++i) { x.push_back(vct[i]); dfs(x); x.pop_back(); } } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { cin>>n; vct.assign(n,0); for(int i=0;i<n;++i) { cin>>vct[i]; } vector<int> tmp; dfs(tmp); cout<<tot<<endl; } return 0; }