题目描述
观察如下的算式:9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:
- 总数目包含题目给出的那个示例。
- 乘数和被乘数交换后作为同一方案来看待。
输出
输出一个整数表示答案
【蒟蒻的辣鸡解题之路】
1.乍一看,啊,好简单,next_permutation搞一搞!然后现实被定式思维一锁,认为两个相乘的数只能是四位和五位。仔细审题后,炸裂啊
2.嗯看清题目后知道要枚举了,但是有一个问题,就是怎么排掉那些重复的呢,好办鸭,把这个两个数顺着倒着存进map数组里,但是最后发现结果少了两个
4.大意了!用上面的方法存,只能存下顺序,很有可能同样一串,但是位数不一样即一串代表的式子不一定是一串昂。所以可以用一个0来隔开两个数,真的美妙,记下来记下来!
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef map<ll,int> mp;
int a[10]={1,2,3,4,5,6,7,8,9};
int vis[13];
mp all;
int main()
{
int ans=0;
do{
//cout<<"-----"<<endl;
for(int w=1;w<=8;w++)
{
ll aa=0;
ll aax=0;
ll b=0;
ll bx=0;
for(int i=0;i<w;i++)
{
aa=aa*10+a[i];
}
for(int i=w;i<9;i++)
{
b=b*10+a[i];
}
aax=aa*pow(10,9-w+1)+b;//来记录两个数分别是什么
bx=b*pow(10,w+1)+aa;
//cout<<aax<<bx<<endl;
ll tem=aa*b;
memset(vis,0,sizeof(vis));
int f=1;
int cnt=0;//感觉判断有点啰嗦
while(tem)
{
int hh=tem%10;
vis[hh]++;
tem=tem/10;
cnt++;
}
if(cnt!=9)
continue;
for(int i=1;i<=9;i++)
{
if(vis[i]!=1)
{
f=0;
break;
}
}
if(f==1&&all[aax]==0&&all[bx]==0)
{
ans++;
all[aax]=1;
all[bx]=1;
}
}
// ans++;
}while(next_permutation(a,a+9));
//cout<<"9!="<<9*8*7*6*5*4*3*2<<endl;
cout<<ans<<endl;
}
answer:1625