Zju1136 Multiple

http://acm.zju.edu.cn/show_problem.php?pid=1136

http://www.jlyzoi.cn/dispbbs.asp?BoardID=8&id;=64 给定除数n和允许使用的数字个数m,然后求出用该m个数字组成的n的倍数的最小那个数是多少。如果不能输出0。

BFS+余数相同的不用处理(这个叫同余?) MS这里有测试数据,不过:

http://acm.pku.edu.cn/JudgeOnline/problem?id=1465 大家去poj交一下。2、3楼交上去都是WA,只有4楼的AC了。 zoj上数据比较弱,我的在zoj上AC了,但是在poj上却WA。 目前已经知道程序有问题,但还不知道怎么改,还没看楼的,现在去看。 答案长度可能超过256,所以第一个不对,不能用字符串存。参照第二个做成procedure即可。 例: 4999 1 1 答案为357个1

注意问题:不能用字符串存答案,而要存新加上的数,然后递归输出,因为有的答案超过256位,而s:=s+’1’是不会给错误提示的,一直是256位。 晕,串行了,点上面的view plain看吧。


program zju1136;
type
    bfs=record
        a:shortint;//新增的数
        n,pre:integer;//n是余数,pre是上一位
        end;
var
    n,m,temp:longint;
    i,j,l,r,t:longint;
    ans:array[0..5000] of bfs;//主数组
    find:array[0..4999] of boolean;
    num:array[1..10] of longint;//最开始的数
    done:boolean;//找到答案
procedure print(i:longint);
begin
	if ans[i].pre>0 then print(ans[i].pre);
	write(ans[i].a);
end;
begin
    assign(input,'dongjin.in');
    assign(output,'dongjin.txt');
    reset(input);
    rewrite(output);
    while not eof do
    begin
        fillchar(find,sizeof(find),false);
        fillchar(ans,sizeof(ans),0);
		fillchar(num,sizeof(num),0);
        done:=false;
        readln(n);
        readln(m);
        for i:=1 to m do readln(num[i]);
        readln;
        for i:=1 to m-1 do//排序
        for j:=i+1 to m do
        if num[i]>num[j] then
        begin
                t:=num[i];
                num[i]:=num[j];
                num[j]:=t;
        end;
        if n=0 then//处理n=0情况
        begin
            writeln(0);
            continue;
        end;
        l:=0;
        r:=0;
        while l<=r do
        begin
            for i:=1 to m do
            begin
                temp:=(ans[l].n*10+num[i]);
                if (temp=0) then continue;
                temp:=temp mod n;
                if not find[temp] then
                begin
                    inc(r);
                    ans[r].n:=temp mod n;
                    ans[r].a:=num[i];
					ans[r].pre:=l;
                    find[ans[r].n]:=true;
                    if (find[0]) and (l>0) then
                    begin
                        done:=true;
                        print(r);
						writeln;
                        break;
                    end;
                end;
            end;
            if done then break else inc(l);
        end;
        if not done then writeln(0);
    end;
    close(input);
    close(output);
end.


comments powered by Disqus