RQNOJ 38 串的計數)

2021-06-09 22:49:18 字數 1869 閱讀 7131

乙個長度為3n字串滿足:由n個a,n個b,n個c組成,對於它的任意字首,滿足a的個數》=b的個數》=c的個數。求滿足這樣條件的字串的個數。

看到這題第一反應:打表!第二反應三個字:高精度

這題動態轉移方程為f[i,j,k]=f[i-1,j,k]+f[i,j-1,k]+f[i,j,k-1]  i,j,k表示a,b,c的個數,考察是否可行

program str;

type

arr=record

len:longint;

d:array[1..15] of longint;

end;

var n,i,j,k:longint;

f:array[0..60,0..60,0..60] of arr;

function max(a,b:longint):longint;

begin

if a>b then exit(a) else exit(b);

end;

procedure sum(a,b:arr;var c:arr);

var i,j:longint;

const

f=100000000;

begin

fillchar(c,sizeof(c),0);

c.len:=max(a.len,b.len);

for i:=1 to c.len do

begin

inc(c.d[i],a.d[i]+b.d[i]);

inc(c.d[i+1],c.d[i] div f);

c.d[i]:=c.d[i] mod f;

end;

if c.d[c.len+1]>0 then inc(c.len);

while (c.len>0) and (c.d[c.len]=0) do dec(c.len);

end;

procedure print(a:arr);

var i,p:longint;

begin

write(a.d[a.len]);

for i:=a.len-1 downto 1 do

begin

p:=a.d[i];

if p<10000000 then write('0');

if p<1000000 then write('0');

if p<100000 then write('0');

if p<10000 then write('0');

if p<1000 then write('0');

if p<100 then write('0');

if p<10 then write('0');

write(p);

end;

writeln;

end;

begin

read(n);

fillchar(f,sizeof(f),0);

f[0,0,0].len:=1;

f[0,0,0].d[1]:=1;

for i:=1 to n do

for j:=0 to i do

for k:=0 to j do

begin

if k>0 then

begin

sum(f[i,j,k],f[i,j,k-1],f[i,j,k]);

end;

if i>j then sum(f[i,j,k],f[i-1,j,k],f[i,j,k]);

if j>k then sum(f[i,j,k],f[i,j-1,k],f[i,j,k]);

end;

print(f[n,n,n]);

end.

38 字串的排列

題目 輸入乙個字串,列印出該字串中字元的所有排列。def string rank string string list string if len string 1 return if len string 1 return string string rank2 string,0 def stri...

3 8 B 分離LZY的字串

lzy又來寫程式模擬隨機字串了,你們是不是很想揍他?先別急,先ac這題再揍。lzy今天又模擬了一串隨機字串,他想讓你們幫幫他,把這個字串劃分為盡可能多的片段,同乙個字母只會出現在其中的乙個片段。輸出每乙個字串片段的長度。測試資料由多組測試樣例組成。每組測試樣例第一行輸入乙個字串 s 1 s.leng...

ATO 38 字串的排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。無重複字元 class solution void per...