题目描述
下面是一个乘法竖式,如果用我们给定的那几个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。
* * *
x * *
-------
* * *
* * *
-------
* * * *
数字只能取代*,当然第一位不能为0。
写一个程序找出所有的牛式。
PROGRAM NAME: crypt1
INPUT FORMAT
Line 1:
数字的个数。
Line 2:
N个用空格分开的数字(每个数字都∈{1,2,3,4,5,6,7,8,9}) 。
SAMPLE INPUT (file crypt1.in)
5
2 3 4 6 8
OUTPUT FORMAT
共一行,一个数字。表示牛式的总数。下面是样例的那个牛式。
2 2 2
x 2 2
------
4 4 4
4 4 4
---------
4 8 8 4
SAMPLE OUTPUT (file crypt1.out)
下面是一个乘法竖式,如果用我们给定的那几个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。
* * *
x * *
-------
* * *
* * *
-------
* * * *
数字只能取代*,当然第一位不能为0。
写一个程序找出所有的牛式。
PROGRAM NAME: crypt1
INPUT FORMAT
Line 1:
数字的个数。
Line 2:
N个用空格分开的数字(每个数字都∈{1,2,3,4,5,6,7,8,9}) 。
SAMPLE INPUT (file crypt1.in)
5
2 3 4 6 8
OUTPUT FORMAT
共一行,一个数字。表示牛式的总数。下面是样例的那个牛式。
2 2 2
x 2 2
------
4 4 4
4 4 4
---------
4 8 8 4
SAMPLE OUTPUT (file crypt1.out)
1
㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘㵘
这题给我的感觉如上。
我们只要不停的枚举就可以了。
提示:每个数字的第一位不能是0。
鉴于长度太短,所以我决定放代码。。。
//usaco 1.3.4
var
a:set of 0..9;
i,j,k,n,ans:longint;
function pd(x,len:longint):boolean;
var
s:string;
begin
str(x,s);
pd:=true;
while x<>0 do
begin
if (x mod 10) in a then
x:=x div 10
else
exit(false);
end;
if length(s)<>len then
exit(false);
end;
begin
readln(n);
for i:=1 to n do
begin
read(j);
a:=a+[j];
end;
for i:=111 to 999 do
begin
if pd(i,3) then
for j:=11 to 99 do
if (pd(j,2)) and (pd(i*(j mod 10),3)) and (pd(i*(j div 10),3)) and (pd(i*j,4)) then
inc(ans);
end;
writeln(ans);
end.