博彩游戏
From admin
背景 Background
Bob最近迷上了一个博彩游戏……
描述 Description
这个游戏的规则是这样的:
每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列;
有M个序列,如果某个序列是产生的随机序列的子串,那么就中奖了,否则不中。
Bob会告诉你这M个序列,和身上有的钱的总数N,当然还有R的范围。
请你告诉Bob中奖的概率有多少?
输入格式 InputFormat
第一行三个用空格隔开的数N、M和R的范围R。
其中1<=R<=9,0<N<=60,0<M<=20000。
下面M行每行一个字符串(长度小于等于20),字符串的每一位范围在1-r之间
保证必要运算都在64位整型范围内。
输出格式 OutputFormat
一行一个实数,表示中奖的概率(保留小数点后5位小数)。
样例输入 SampleInput [复制数据]
5 1 3
样例输出 SampleOutput [复制数据]
0.86831
数据范围和注释 Hint
数据分布:
第1个点~第10个点,每个点5分;
第11个点~第15个点,每个点10分。
对于样例的解释:
随机序列一共有3^5=243个,其中包含"1"的个数为211个,则概率为211/243=0.86831
来源 Source
Bob HAN
题解:
这题和上一题差不多
代码 :
1 var n,m,r,i,j,tot:longint; 2 ans1,ans2:int64; 3 a:array[0..400000,0..20] of longint; 4 f:array[0..60,0..400000] of int64; 5 fail,q:array[0..400000] of longint; 6 flag:array[0..400000] of boolean; 7 s:string; 8 procedure insert; 9 var i,now:longint; 10 begin 11 readln(s);now:=1; 12 for i:=1 to length(s) do 13 begin 14 j:=ord(s[i])-ord(‘0‘); 15 if a[now,j]=0 then begin inc(tot);a[now,j]:=tot;end; 16 now:=a[now,j]; 17 end; 18 flag[now]:=true; 19 end; 20 procedure acmatch; 21 var h,t,i,now,k:longint; 22 begin 23 h:=0;t:=1;q[1]:=1;fail[1]:=0; 24 while h<t do 25 begin 26 inc(h);now:=q[h]; 27 for i:=1 to r do 28 begin 29 if a[now,i]=0 then continue; 30 k:=fail[now]; 31 while a[k,i]=0 do k:=fail[k]; 32 fail[a[now,i]]:=a[k,i]; 33 if flag[a[k,i]] then flag[a[now,i]]:=true; 34 inc(t);q[t]:=a[now,i]; 35 end; 36 end; 37 end; 38 procedure init; 39 begin 40 tot:=1; 41 readln(n,m,r); 42 for i:=1 to r do a[0,i]:=1; 43 for i:=1 to m do insert; 44 acmatch; 45 end; 46 procedure dp(x:longint); 47 var i,j,k:longint; 48 begin 49 for i:=1 to tot do 50 begin 51 if (flag[i]) or (f[x-1,i]=0) then continue; 52 for j:=1 to r do 53 begin 54 k:=i; 55 while a[k,j]=0 do k:=fail[k]; 56 inc(f[x,a[k,j]],f[x-1,i]); 57 end; 58 end; 59 end; 60 procedure main; 61 begin 62 ans2:=1; 63 f[0,1]:=1; 64 for i:=1 to n do ans2:=ans2*r; 65 for i:=1 to n do dp(i); 66 for i:=1 to tot do 67 if not(flag[i]) then inc(ans1,f[n,i]); 68 writeln((ans2-ans1)/ans2:0:5); 69 end; 70 begin 71 assign(input,‘input.txt‘);assign(output,‘output.txt‘); 72 reset(input);rewrite(output); 73 init; 74 main; 75 close(input);close(output); 76 end.
tyvj1519博彩游戏
时间: 2024-10-11 23:16:24