https://www.acwing.com/problem/content/description/1211/
优化前
4906ms
#include<bits/stdc++.h>
using namespace std;
int n;
bool st[10];
int ans = 0;
vector<int>add;
int one;
void ones(int u)
{
if (u > 9)
{
/* one = 0;
for (int i = 0; i < add.size(); i++) {
one = add[i] + 10*one;
}*/
for (int i = 0; i < 7; i++) {
for (int j = i+2; j < 9; j++)
{
int a = 0, b = 0, c = 0;
for (int k = 0; k <= i; k++)a = a * 10 + add[k];
for (int l = i + 1; l < j; l++)b = b * 10 + add[l];
for (int f = j; f < 9; f++)c = c * 10 + add[f];
// cout << a << b << c << endl;
if (a + b / c == n && b % c == 0)ans++;
}
}
return;
}
for (int i = 1; i < 10; i++) {
if (!st[i]) {
st[i] = true;
add.push_back(i);
ones(u + 1);
add.pop_back();
st[i] = false;
}
}
}
int main() {
cin >> n;
ones(1);
cout << ans;
return 0;
}
优化后
857ms
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n;
int st[N],st2[N];
int ans;
bool check(int a,int b,int u)
{
int c=(n-a)*b;
int s=c;
int z=0;
// if(a==3&&b==714)printf("12");
// printf("%d\n",b);
memcpy(st2,st,sizeof st);
while(c)
{
st2[c%10]=true;
// cout<<c%10;
c/=10;
z++;
}
// cout<<z;
for(int i=1;i<=9;i++)
{
if(!st2[i]){return false;}
}
//cout<<a<<b<<endl;//<<s<<endl;
// cout<<z<<u;
// if(a==3&&b==714)printf("%d %d",z, u);
return (z==9-u);
}
void _b(int u,int a,int b)
{
// if(b)cout<<b<<endl;
if(u==9)return ;
else if(b&&check(a,b,u-1)){ans++;}
for(int i=1;i<=9;i++)
{
if(!st[i])
{
st[i]=true;
_b(u+1,a,b*10+i);
st[i]=false;
}
}
}
void _a(int u,int a)
{
if(u==7||a>=n)return ;
else if(a){_b(u+1,a,0);}
for(int i=1;i<=9;i++)
{
if(!st[i]){
st[i]=true;
_a(u+1,a*10+i);
st[i]=false;
//_a(u+1,a);
}
}
}
int main(){
cin>>n;
_a(0,0);
cout<<ans;
//cout<<check(3,714,4);
return 0;
}