Description

Math Olympiad is called “Aoshu” in China. Aoshu is very popular in elementary schools. Nowadays, Aoshu is getting more and more difficult. Here is a classic Aoshu problem:

ABBDE __ ABCCC = BDBDE

In the equation above, a letter stands for a digit(0 � 9), and different letters stands for different digits. You can fill the blank with ‘+’, ‘-‘ , ‘×’ or ‘÷’.

How to make the equation right? Here is a solution:

12245 + 12000 = 24245

In that solution, A = 1, B = 2, C = 0, D = 4, E = 5, and ‘+’ is filled in the blank.

When I was a kid, finding a solution is OK. But now, my daughter’s teacher tells her to find all solutions. That’s terrible. I doubt whether her teacher really knows how many solutions are there. So please write a program for me to solve this kind of problems.

 

Input

The first line of the input is an integer T( T <= 20) indicating the number of test cases.

Each test case is a line which is in the format below:

s1 s2 s3

s1, s2 and s3 are all strings which are made up of capital letters. Those capital letters only include ‘A’,’B’,’C’,’D’ and ‘E’, so forget about ‘F’ to ‘Z’. The length of s1,s2 or s3 is no more than 8.

When you put a ‘=’ between s2 and s3, and put a operator( ‘+’,’-‘, ‘×’ or ‘÷’.) between s1 and s2, and replace every capital letter with a digit, you get a equation.

You should figure out the number of solutions making the equation right.

Please note that same letters must be replaced by same digits, and different letters must be replaced by different digits. If a number in the equation is more than one digit, it must not have leading zero.

 

Output

For each test case, print an integer in a line. It represents the number of solutions. 
 

Sample Input

2
A A A
BCD BCD B
 

Sample Output

5
72
 
暴力
卡题原因:全排列过后数字是完全打乱的,这时候直接选取新的组合是错误的,必须恢复原来的顺序
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int per[5],temper[5];
char left[10],right[10],equ[10];
int index[5];
int del(char ch){
return index[ch-'A'];
}
int getnum(char* str){
int ans=0;
for(int i=0;str[i];i++){
ans*=10;
ans+=per[del(str[i])];
}
return ans;
}
void cpy(int *a,int *b,int len){
for(int i=0;i<len;i++)a[i]=b[i];
}
void pr(int lnum,int rnum,int equ,int op){
/*printf("%d ",lnum);
if(op==0)putchar('+');
else if(op==1)putchar('-');
else if(op==2)putchar('*');
else if(op==3)putchar('/');
printf(" %d = %d\n",rnum,equ);*/
}
int check(){
int ans=0;
int lnum=getnum(left),rnum=getnum(right),eqnum=getnum(equ);
if(lnum+rnum==eqnum){pr(lnum,rnum,eqnum,0);ans++;}
if(lnum-rnum==eqnum){pr(lnum,rnum,eqnum,1);ans++;}
if(lnum*rnum==eqnum){pr(lnum,rnum,eqnum,2);ans++;}
if(rnum!=0&&lnum/rnum==eqnum&&lnum%rnum==0){pr(lnum,rnum,eqnum,3);ans++;}
return ans;
}
int dfs(int s,int ind,int rlen,int llen,int elen,int allen){
int ans=0;
per[s]=ind;
if(s==allen-1){
cpy(temper,per,allen);//注意记录原值,否则因为顺序是反的,就不能直接修改取的数字
if(!((per[del(left[0])]==0&&llen>1)||(per[del(right[0])]==0&&rlen>1)||(per[del(equ[0])]==0&&elen>1)))
ans+=check();
while(next_permutation(per,per+allen)){
// for(int i=0;i<allen;i++)printf("%d%c",per[i],i==allen-1?'\n':' ');
if((per[del(left[0])]==0&&llen>1)||(per[del(right[0])]==0&&rlen>1)||(per[del(equ[0])]==0&&elen>1))continue;
ans+=check();
}
cpy(per,temper,allen);
}
else {
for(int i=ind+1;i<10;i++)ans+=dfs(s+1,i,llen,rlen,elen,allen);
}
return ans;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%s%s%s",left,right,equ);
int ans=0;
for(int i=0;i<5;i++)per[i]=i;
int llen=strlen(left),rlen=strlen(right),elen=strlen(equ);
memset(index,-1,sizeof(index));
int allen=0;
for(int i=0;left[i];i++)if(index[left[i]-'A']==-1)index[left[i]-'A']=allen++;
for(int i=0;right[i];i++)if(index[right[i]-'A']==-1)index[right[i]-'A']=allen++;
for(int i=0;equ[i];i++)if(index[equ[i]-'A']==-1)index[equ[i]-'A']=allen++;
for(int i=0;i<10;i++)ans+=dfs(0,i,llen,rlen,elen,allen);
printf("%d\n",ans);
}
return 0;
}

  

hdu 3699 10 福州 现场 J - A hard Aoshu Problem 暴力 难度:0的更多相关文章

  1. hdu 3687 10 杭州 现场 H - National Day Parade 水题 难度:0

    H - National Day Parade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  2. hdu 3695 10 福州 现场 F - Computer Virus on Planet Pandora 暴力 ac自动机 难度:1

    F - Computer Virus on Planet Pandora Time Limit:2000MS     Memory Limit:128000KB     64bit IO Format ...

  3. hdu 3697 10 福州 现场 H - Selecting courses 贪心 难度:0

    Description     A new Semester is coming and students are troubling for selecting courses. Students ...

  4. hdu 3694 10 福州 现场 E - Fermat Point in Quadrangle 费马点 计算几何 难度:1

    In geometry the Fermat point of a triangle, also called Torricelli point, is a point such that the t ...

  5. hdu 3696 10 福州 现场 G - Farm Game DP+拓扑排序 or spfa+超级源 难度:0

    Description “Farm Game” is one of the most popular games in online community. In the community each ...

  6. hdu 3682 10 杭州 现场 C - To Be an Dream Architect 简单容斥 难度:1

    C - To Be an Dream Architect Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &a ...

  7. hdu 3682 10 杭州 现场 C To Be an Dream Architect 容斥 难度:0

    C - To Be an Dream Architect Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &a ...

  8. hdu 3685 10 杭州 现场 F - Rotational Painting 重心 计算几何 难度:1

    F - Rotational Painting Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  9. hdu 3262 09 宁波 现场 C - Seat taking up is tough 暴力 难度:0

    Description Students often have problems taking up seats. When two students want the same seat, a qu ...

随机推荐

  1. Android复习

    第一章 1.Android系统架构:(四层) Linux内核层:为安卓设备的各种硬件提供底层的驱动. 系统运行库层:为Android系统提供主要的特性支持. 应用框架层:提供了构建应用程序可能用到的各 ...

  2. django之中间件、缓存、信号、admin内置后台

    目录: 中间件 缓存 信号 admin后台 一.中间件 1.什么是中间件? 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的 ...

  3. Flask系列之源码分析(一)

    目录: 涉及知识点 Flask框架原理 简单示例 路由系统原理源码分析 请求流程简单源码分析 响应流程简单源码分析 session简单源码分析 涉及知识点 1.装饰器 闭包思想 def wapper( ...

  4. 模块讲解----XML模块

    XML实现不同语言或者程序之间进行数据交换的协议XML文件格式如下: 1.浏览器返回的字符串格式类型有: a.HTML b.Json c.XML 2.XML格式如下: <data> #表示 ...

  5. h5前端项目常见问题汇总

    原文作者:FrontEndZQ 原文链接:https://github.com/FrontEndZQ/HTML5-FAQ H5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度 ...

  6. C++语言中的四种类型转换

    1 引子 这篇笔记是根据StackOverflow上面的一个问题整理而成,主要内容是对C/C++当中四种类型转换操作进行举例说明.在之前其实对它们都是有所了解的,而随着自己在进行总结,并敲了一些测试示 ...

  7. Integration Services 变量

    如果没有变量,你会发现在ssis里面啥都干不成,和人没有灵魂一样 对系统变量唯一可配置的选项是指定变量在更改值时是否引发事件. 待续

  8. Educational Codeforces Round 57 Solution

    A. Find Divisible 签到. #include <bits/stdc++.h> using namespace std; int t, l, r; int main() { ...

  9. Android ActionBar自定义

    关于自定义的ActionBar的实现过程,这里做下笔记以供之后查看. 1.默认状态 使用Android Studio新建一个名为“ActionBar”的应用,默认actionbar如图(1)所示. 图 ...

  10. 使用spring cache和ehcache之前必须了解的

    好长时间没写博客了,真的是没时间啊.ps:其实就是懒!!接下来几篇要写下缓存,这里主要写下ehcache与spring整合的内容,包括aop形式的缓存,基于注解的缓存,页面缓存这三方面吧.在这之前先要 ...