[USACO1.3] 牛式 Prime Cryptarithm

题目描述

下面是一个乘法竖式,如果用我们给定的那 n n n 个数字来取代 *,可以使式子成立的话,我们就叫这个式子为牛式。

          ***
    x      **
   ----------
         ***
        ***
   ----------
        ****

数字只能取代 *,当然第一位不能为 0 0 0,况且给定的数字里不包括 0 0 0

注意一下在美国的学校中教的“部分乘积”,第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积。

请计算出牛式的数量。

输入格式

第一行一个正整数 n n n,表示可用的数集。
第二行 n n n 个正整数 a i a_i ai,表示可用的数。

输出格式

输出一行一个整数,表示牛式的总数。

样例 #1

样例输入 #1

5
2 3 4 6 8

样例输出 #1

1

提示

样例解释

          222
    x      22
   ----------
         444
        444
   ----------
        4884

不需要别的数,严格符合上图的数位情况,可以证明没有其他情况。

不加入样例解释:做题人如果理解错题意会进入误区

比如不用填中间的数,位数没有要求 34*2=68 符合要求等误区。

数据规模

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 9 1\le n \le 9 1n9 a i ∈ [ 1 , 9 ] ∩ Z a_i \in [1,9] \cap \mathbb Z ai[1,9]Z a i a_i ai 不重复。

题目翻译来自NOCOW。

USACO Training Section 1.4

我的代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[10];
int ss(int i,int j){
    int a1=i*(j%10);
    int b=i*(j/10);
    int c=i*j;
    if(a1>999) return 0;
    if(b>999) return 0;
    if(c>9999) return 0;
    while(i!=0){
        if(a[i%10]==0){
            return 0;
        }
        i/=10;
    }
    while(j!=0){
        if(a[j%10]==0)  return 0;j/=10;}
    while(a1!=0){
        if(a[a1%10]==0) return 0;a1/=10;
    }
    while(b!=0){
        if(a[b%10]==0) return 0;b/=10;
    }
    while(c!=0){
        if(a[c%10]==0) return 0;c/=10;
    }
    return 1;
}
int main(){
    int n,x;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x;
        a[x]++;
    }
    int s1=0;
    for(int i=100;i<=999;i++){
        for(int j=10;j<=99;j++){
            if((i*j)>9999){
                continue;
            }
            if(ss(i,j)==1){
                 s1++;
            }
        }
    }
    cout<<s1;
    return 0;
}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部