BZOJ3198:[SDOI2013]SPRING
Description
Input
Output
Sample Input
3 3
1 2 3 4 5 6
1 2 3 0 0 0
0 0 0 4 5 6
1 2 3 4 5 6
1 2 3 0 0 0
0 0 0 4 5 6
Sample Output
2
HINT
题解:
一脸容斥的样子。
枚举判断是否相同的泉水集合S,若|S|>=K,则inc(ANS,(-1)^(|S|-K)*C(|S|,K)*相同对数)。
用哈希表记录、判断(我之前竟然写了类似字符串哈希的的做法,哈希值相同直接判断相同,WA惨了)。
代码:
1 var 2 i,j,k,l,n,m:longint; 3 f:array[0..200001,1..6]of int64; 4 b:array[1..6]of longint; 5 c:array[0..6,0..6]of int64; 6 cc:array[0..133330]of longint; 7 d:array[0..200001,-1..6]of longint; 8 a:array[0..200001]of int64; 9 ans:int64; 10 procedure find(x,z:longint;y:int64); 11 var i,j,l:longint; 12 begin 13 i:=cc[a[z]]; 14 while i>0 do 15 begin 16 l:=0; 17 for j:=1 to x do if d[i,j]<>f[z,b[j]] then begin l:=1; break; end; 18 if l=0 then begin ans:=ans+y*d[i,0]; inc(d[i,0]); exit; end; 19 i:=d[i,-1]; 20 end; 21 inc(m); for i:=1 to x do d[m,i]:=f[z,b[i]]; 22 d[m,0]:=1; d[m,-1]:=cc[a[z]]; cc[a[z]]:=m; 23 end; 24 function ss2(x:longint;y:int64):int64; 25 var i,j,k:longint; 26 begin 27 ss2:=0; m:=0; 28 for i:=0 to 133330 do cc[i]:=0; 29 for i:=1 to n do 30 begin 31 a[i]:=1; 32 for j:=1 to x do a[i]:=(a[i]*13131+f[i,b[j]])mod 133331; 33 find(x,i,y); 34 end; 35 end; 36 procedure ss(x,y:longint); 37 var i:longint; 38 begin 39 if x>6 then 40 begin 41 if y>=k then 42 begin 43 if(y-k)mod 2=0 then ss2(y,c[y,k]) 44 else ss2(y,-c[y,k]); 45 end; 46 exit; 47 end; 48 ss(x+1,y); 49 inc(y); b[y]:=x; ss(x+1,y); 50 end; 51 begin 52 c[0,0]:=1; 53 for i:=1 to 6 do 54 begin 55 c[i,0]:=1; c[i,i]:=1; 56 for j:=1 to i-1 do c[i,j]:=c[i-1,j-1]+c[i-1,j]; 57 end; 58 readln(n,k); 59 for i:=1 to n do 60 for j:=1 to 6 do read(f[i,j]); 61 ss(1,0); 62 writeln(ans); 63 end.