[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 1≤n≤9, 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;
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » P1211 [USACO1.3] 牛式 Prime Cryptarithm
发表评论 取消回复