USACO: Prime Cryptarithm

Problem Link : http://train.usaco.org/usacoprob2?a=dOLJGJAE7bv&S=crypt1


/*
TASK: crypt1
LANG: C++
*/

#include <bits/stdc++.h>

#define pii pair <int,int>
#define sc scanf
#define pf printf
#define Pi 2*acos(0.0)
#define ms(a,b) memset(a, b, sizeof(a))
#define pb(a) push_back(a)
#define MP make_pair
#define oo 1<<29
#define dd double
#define ll long long
#define EPS 10E-10
#define ff first
#define ss second
#define MAX 10000
#define CIN ios_base::sync_with_stdio(0); cin.tie(0)
#define SZ(a) (int)a.size()
#define getint(a) scanf("%d",&a)
#define getint2(a,b) scanf("%d%d",&a,&b)
#define getint3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define loop(i,n) for(int i=0;i<n;i++)
#define TEST_CASE(t) for(int z=1;z<=t;z++)
#define PRINT_CASE printf("Case %d: ",z)
#define all(a) a.begin(),a.end()
#define intlim 2147483648
#define inf 1000000
#define rtintlim 46340
#define llim 9223372036854775808
#define rtllim 3037000499
#define ull unsigned long long
#define I int

using namespace std;
int ara[11];
bool mp[11];

int main()
{
    freopen("crypt1.in","r",stdin);
    freopen("crypt1.out","w",stdout);

    int n;
    cin>>n;
    loop(i,n)
        {
            cin>>ara[i];
            mp[ara[i]]=1;
        }
    int cnt=0;
    loop(a,n)
    loop(b,n)
    loop(c,n)
    {
        int abc=ara[a]*100+ara[b]*10+ara;
        if( abc/1000 !=0)
            continue;
        int p1,p2;
        loop(d,n)
        {
            p1=abc*ara[d];
            if( p1/1000 !=0)
            continue;
            int temp1=p1;
            bool test=0;
            while(temp1)
            {
                if(mp[temp1%10]==1)
                {
                    temp1/=10;
                }
                else
                {
                    test=1;
                    break;
                }
            }
            if(test)
                continue;
            loop(e,n)
            {
                p2=abc*ara[e];
                if( p2/1000 !=0)
                continue;
                int temp2=p2;
                bool test=0;
                while(temp2)
                {
                    if(mp[temp2%10]==1)
                    {
                        temp2/=10;
                    }
                    else
                    {
                        test=1;
                        break;
                    }
                }
                if(test)
                    continue;
                int ans=p1+p2*10;
                while(ans)
                {
                    if(mp[ans%10]==1)
                        ans/=10;
                    else
                    {
                        test=1;
                        break;
                    }
                }
                if(test==0)
                    cnt++;
            }
        }
    }
    cout<<cnt<<endl;
    return 0;
}


0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments