乙個長度為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...