Advertisement
Guest User

Untitled

a guest
Jan 26th, 2013
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.73 KB | None | 0 0
  1. var s:string;
  2. i,n,f,check:integer;
  3. a,b,c:boolean;
  4. k:array[1..30]of int64;
  5. f1,f2:text;
  6. begin
  7. assign(f1,'input.txt');
  8. assign(f2,'output.txt');
  9. reset(f1);
  10. rewrite(f2);
  11. readln(f1,n);
  12. readln(f1,s);
  13. k[1]:=0; //тут мы
  14. k[2]:=2; //заполняем
  15. k[3]:=6; //варинты
  16. k[4]:=14;//комбинаций
  17. k[5]:=42;//2 и 5
  18. k[6]:=58;//дальше было влом
  19. if s[1]='*' then a:=true; //проверяем на наличие в 1 символе нуля
  20. if (pos('2',s)<>0)or(pos( '5',s)<>0) then b:=true; //если есть 2 или 5, то нету 3
  21. if pos('3',s)<>0 then c:=true; //наоборот
  22.  
  23. if (pos('3',s)<>0)and(pos('5',s)<>0) then begin writeln(f2,0); close(f2); halt; end; //нахуй
  24. if (pos('3',s)<>0)and(pos('2',s)<>0) then begin writeln(f2,0); close(f2); halt; end; //уходим
  25. if (pos('4',s)<>0)or(pos('6',s)<>0) then begin writeln(f2,0); close(f2); halt; end;  //если
  26. if (pos('7',s)<>0)or(pos('9',s)<>0) then begin writeln(f2,0); close(f2); halt; end;  //есть
  27.  
  28.     while (pos('2',s)<>0)and(s[length(s)-pos('2',s)+1]='5') do begin
  29.     delete(s,length(s)-pos('2',s)+1,1); //удаляем "зеркальные" 2 и 5
  30.     delete(s,pos('2',s),1); end;
  31.     while (pos('2',s)<>0)and(s[length(s)-pos('2',s)+1]='*') do begin
  32.     delete(s,length(s)-pos('2',s)+1,1); //удаляем "зеркальные" 2 и *, т.к. вместо звездочки может быть лишь 5
  33.     delete(s,pos('2',s),1); end;
  34.     while (pos('5',s)<>0)and(s[length(s)-pos('5',s)+1]='*') do begin
  35.     delete(s,length(s)-pos('5',s)+1,1); //аналогично
  36.     delete(s,pos('5',s),1); end;
  37.    
  38. for i:=1 to (length(s) div 2) do
  39. if (s[i]='*')and(s[length(s)-i+1]='*') then inc(check);
  40. f:=(length(s) div 2)-check; //считаем, сколько у нас может быть пар 2-5 вместо звездочек
  41.    
  42. if (pos('2',s)<>0)or(pos('5',s)<>0) then begin writeln(f2,0); close(f2); halt; end; //если у нас после удаления остались 2 и 5, то нахуй выходим
  43.  
  44.     while (pos('1',s)<>0) do //удаеляем, т.к. эти числа всегда зеркальны
  45.     delete(s,pos('1',s),1);
  46.     while (pos('3',s)<>0) do
  47.     delete(s,pos('3',s),1);
  48.     while (pos('8',s)<>0) do
  49.     delete(s,pos('8',s),1);
  50.     while (pos('0',s)<>0) do
  51.     delete(s,pos('0',s),1);
  52.    
  53.    
  54. if (length(s)=0)or(s[1]=' ') then begin writeln(f2,1); close(f2); halt; end; //если длина 0, то мы удалили все, значит 1 вариант
  55. if length(s)=1 then if a=true then begin writeln(f2,3); close(f2); halt; end else begin writeln(f2,4); close(f2); halt; end; //при 1 выводим
  56.  
  57. if (length(s) div 2)<check then k[length(s)]:=0 else if length(s)>f then k[length(s)]:=k[length(s)-f] else k[length(s)]:=k[1]; //эта хуйня вообще хз как работает/должна работать
  58.  
  59. if a=false then begin //если 1 символ не '*' то->>
  60. if c=true then writeln(f2,exp(length(s)*ln(4))) else //хуярим непонятную формулу 4^length(s) если есть тройка
  61. if b=true then writeln(f2,k[length(s)]+exp(length(s)*ln(3))) else //аналогично, только добавляем комбинации с 2/5
  62. if (c=false)and(b=false) then writeln(f2,exp(length(s)*ln(4))+k[length(s)]); //все варианты, при остутсвии 2/3/5
  63. end else
  64. if c=true then writeln(f2,exp(length(s)*ln(4)-ln(4))) else //тоже самое, только при первом символе '*'
  65. if b=true then writeln(f2,k[length(s)]+exp(length(s)*ln(3)-ln(3))) else
  66. if (c=false)and(b=false) then writeln(f2,exp(length(s)*ln(4)-ln(4))+k[length(s)]);
  67.  
  68. //в формулах уверен на 50%
  69. close(f2);
  70. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement