Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define PB push_back
- #define ZERO (1e-10)
- #define INF int(1e9+1)
- #define CL(A,I) (memset(A,I,sizeof(A)))
- #define DEB printf("DEB!\n");
- #define D(X) cout<<" "<<#X": "<<X<<endl;
- #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
- typedef long long ll;
- typedef pair<ll,ll> pll;
- typedef vector<int> vi;
- typedef pair<int,int> ii;
- typedef vector<ii> vii;
- #define IN(n) int n;scanf("%d",&n);
- #define FOR(i, m, n) for (int i(m); i < n; i++)
- #define F(n) FOR(i,0,n)
- #define FF(n) FOR(j,0,n)
- #define FT(m, n) FOR(k, m, n)
- #define aa first
- #define bb second
- void ga(int N,int *A){F(N)scanf("%d",A+i);}
- char s[666],r[666],m[666],c;
- int A,B,C,l,J[150],L,X,Y,Z;
- ll rd(char*s,int L){
- ll S=0;
- F(L)S*=10,S+=J[(int)s[i]];
- return S;
- }
- void tf(char*s,int L){F(L)s[i]=J[(int)s[i]]+48;}
- int gt(int c){return c?J[c]:0;}
- //MULTIPLICATION
- bool mm(int I,int x,int b);
- bool rp(int I,int S,int t,int b){
- if(t<=I){
- int u=s[I-t],v=r[t];
- int a=gt(u),c=gt(v);
- if(~a){
- if(~c)return rp(I,S+a*c,t+1,b);
- F(10)if(!(b&1<<i)){
- J[v]=i;
- if(rp(I,S+i*a,t+1,b|1<<i))return 1;
- }
- J[v]=-1;
- return 0;
- }else if(u==v){
- F(10)if(!(b&1<<i)){
- J[u]=i;
- if(rp(I,S+i*i,t+1,b|1<<i))return 1;
- }
- J[u]=-1;
- return 0;
- }else {
- F(10)if(!(b&1<<i)){
- J[u]=i;
- if(~c){
- if(rp(I,S+i*c,t+1,b|1<<i))return 1;
- }else{
- FF(10)if(i^j&&!(b&1<<j)){
- J[v]=j;
- if(rp(I,S+i*j,t+1,b|1<<j|1<<i))return 1;
- }
- J[v]=-1;
- }
- }
- J[u]=-1;
- return 0;
- }
- return 0;
- }
- int u=m[I],c=gt(u);
- if(~c)return c==S%10&&mm(I+1,S/10,b);
- if(b&1<<(S%10))return 0;
- J[u]=S%10;
- if(mm(I+1,S/10,b|1<<(S%10)))return 1;
- J[u]=-1;
- return 0;
- }
- bool mm(int I,int x,int b){
- if(!J[X]||!J[Y]||!J[Z])return 0;//NEW
- if(I==C)return !x;
- return rp(I,x,0,b);
- }
- void mp(){
- CL(J,-1),reverse(s,s+A),reverse(r,r+B),reverse(m,m+C);
- assert(mm(0,0,0));
- reverse(s,s+A),reverse(r,r+B),reverse(m,m+C);
- assert(rd(s,A)*rd(r,B)==rd(m,C));//TODO ASS
- tf(s,A),tf(r,B),tf(m,C);
- printf("%s * %s = %s\n",s,r,m);
- }
- //ADDITION
- bool ad(int I,bool x,int b);
- bool rec(int I,int S,int t,int b){
- int u=t?t>1?m[I]:r[I]:s[I],a;
- if(t<2){
- a=gt(u);
- if(~a)return rec(I,S+a,t+1,b);
- F(10)if(!(b&1<<i)){
- J[u]=i;
- if(rec(I,S+i,t+1,b|1<<i))return 1;
- }
- J[u]=-1;
- return 0;
- }
- int c=gt(u);
- if(~c)return c==S%10&&ad(I+1,S/10,b);
- if(b&1<<(S%10))return 0;
- J[u]=S%10;
- if(ad(I+1,S/10,b|1<<(S%10)))return 1;
- J[u]=-1;
- return 0;
- }
- bool ad(int I,bool x,int b){
- if(!J[X]||!J[Y]||!J[Z])return 0;//NEW
- if(I==C)return !x;
- return rec(I,x,0,b);
- }
- void add(){
- CL(J,-1),reverse(s,s+A),reverse(r,r+B),reverse(m,m+C);
- assert(ad(0,0,0));
- reverse(s,s+A),reverse(r,r+B),reverse(m,m+C);
- assert(rd(s,A)+rd(r,B)==rd(m,C));//TODO ASS
- tf(s,A),tf(r,B),tf(m,C);
- printf("%s + %s = %s\n",s,r,m);
- }
- int main(void){
- while(~scanf("%s %c%s%*s%s",s,&c,r,m)){
- A=strlen(s),B=strlen(r),C=strlen(m);
- assert(C>=A&&B<=C);//TODO ASS - not true
- X=*s,Y=*r,Z=*m;
- if(A==1)X=32;
- if(B==1)Y=32;
- if(C==1)Z=32;
- if(c==42)mp();
- else add();
- CL(s,0),CL(r,0),CL(m,0);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement