Cod sursa(job #1315)

Utilizator goguGogu Marian gogu Data 13 decembrie 2006 12:34:34
Problema Cowfood Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.61 kb
//uses sysutils,timer;
const rest=3210121;
type sir=array[0..31] of integer;
var a:array[0..25] of sir;
pos:array[0..30,0..10000] of longint;
comb,rez,i,j,k,l,m,n,s,nr,pow:longint;
v,sum:sir;

procedure precalc; inline;
var i,j:longint;
begin
for i:=0 to nr do pos[i,0]:=1;
for i:=0 to s do pos[0,i]:=1;
for i:=1 to nr do
 for j:=1 to s do
 begin
 pos[i,j]:=(pos[i,j-1]+pos[i-1,j]);
 if pos[i,j]>=rest then dec(pos[i,j],rest);
 end;
end;

procedure back(k,num,sum:longint; v:sir); inline;
var i:longint;
begin
if k=n+1 then
         begin
         if odd(num) then num:=-1
                     else num:=1;
         inc(rez,pos[nr, s-sum]*num+rest);
         while rez>=rest do dec(rez,rest);
         end
         else
         begin
         back(k+1,num,sum,v);
         for i:=1 to nr do
         if a[k,i]>v[i] then
                        begin
                        inc(sum, a[k,i]-v[i]);
                        v[i]:=a[k,i];
                        end;
         if sum<=s then back(k+1,num+1,sum,v);
         end;
end;

begin
//start;
assign(input,'cowfood.in'); reset(input);
assign(output,'cowfood.out'); rewrite(output);
read(nr,s,n);
precalc;
for i:=1 to n do
 for j:=1 to nr do
  begin
  read(a[i,j]);
  inc(sum[i], a[i,j]);
  end;
for i:=1 to n do
 for j:=i+1 to n do
 if sum[i]<sum[j] then
                  begin
                  k:=sum[i]; sum[i]:=sum[j]; sum[j]:=k;
                  a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0];
                  end;
back(1,0,0,v);
rez:=(rez-nr*s+nr*rest-1) mod rest;
writeln(rez);
//scurs;
close(input); close(output);
end.