[蓝桥杯2017初赛]9数算式
题目描述
观察如下的算式:9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:
1. 总数目包含题目给出的那个示例。
2. 乘数和被乘数交换后作为同一方案来看待。
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:
1. 总数目包含题目给出的那个示例。
2. 乘数和被乘数交换后作为同一方案来看待。
输出
输出一个整数表示答案
答案:1625
题解:全排列之后,用for循环枚举乘数和被乘数,用map标记符合条件的组合
#include<iostream> #include<string> #include<algorithm> #include<math.h> #include<string.h> #include<map> #include<stack> #include<queue> #define ll long long using namespace std; int vis[10]; map<ll,int>mp; int main() { int a[9]={1,2,3,4,5,6,7,8,9}; int cnt=0; do { for(int i=1;i<9;i++) { ll ans,l=0,r=0,t=0,x=0,y=0; memset(vis,0,sizeof(vis)); for(int j=0;j<=i;j++) l=l*10+a[j]; x=l; x=x*10; for(int k=i+1;k<9;k++) { r=r*10+a[k]; x=x*10+a[k]; } y=r; y=y*10; for(int j=0;j<=i;j++) y=y*10+a[j]; ans=l*r; ll ff=ans; while(ans) { int temp=ans%10; ans=ans/10; if(vis[temp]==0&&temp!=0) { vis[temp]=1; t++; } } if(t==9&&mp.count(x)==0&&mp.count(y)==0) { cnt++; mp[x]=1; mp[y]=1; //cout<<l<<" "<<r<<" "<<ff<<endl; } } }while(next_permutation(a,a+9)); cout<<cnt<<endl; return 0; }
等风起的那一天,我已准备好一切