Поиск по этому блогу

суббота, 23 сентября 2017 г.

Степень строки

Время: 1 сек. Память: 16 Мб Сложность: 30%)

Пусть задана строка s = s1s2...sn. Назовем ее k-ой (k > 0) степенью sk строку sk = s1s2 . . .sns1s2 . . .sn......s1s2...sn (k раз). Например, третьей степенью строки abc является строка аbсаbсаbс.

Корнем k степени из строки s называется такая строка t (если она существует), что tk = s.

Ваша задача состоит в том, чтобы написать программу, находящую степень строки или корень из нее.
Входные данные
Первая строка входного файла INPUT.TXT содержит строку s, она содержит только маленькие буквы английского алфавита и имеет ненулевую длину, не превосходящую 1000.

Вторая строка входного файла содержит целое число k ≠ 0, |k| < 100001. Если k > 0, то необходимо найти k-ую степень строки s, если k < 0, то необходимо найти корень степени |k| из s.
Выходные данные

В выходной файл OUTPUT.TXT выведите строку, являющуюся ответом на задачу. Если длина ответа превосходит 1023 символа, выведите только первые 1023 символа. Если искомой строки не существует — выведите NO SOLUTION.
Примеры
INPUT.TXT
OUTPUT.TXT
1
abc
3
abcabcabc
2
abcdabcd
-2
abcd
3
abcd
-4
NO SOLUTION
Решение:
var s,a,b:string;
i,n,c,o,d:integer;
f,f1:text;
begin
assign(f,'input.txt');
reset(f);
assign(f1,'output.txt');
rewrite(f1);
readln(f,s);
readln(f,c);n:=length(s);
if (c<0) and (abs(c)>n) or (c<0) and (n mod abs(c) <>0) then write(f1,'NO SOLUTION') else begin
if c<0 then begin o:=abs(c); d:=n div o;
a:=copy(s,1,d);
b:=a; delete(s,1,d);
for i:=1 to o-1 do
begin
a:=copy(s,1,d);
if a<> b then b:='NO SOLUTION';
delete(s,1,d);
end;
write(f1,b); end
else begin if n*c>1023 then begin
o:=1023 div n;
if 1023 mod n>0 then o:=o+1;
b:=s*o;
b:=copy(b,1,1023);
write(f1,b);
end else begin b:=s*c; write(f1,b); end; end;
end;
close(f1); close(f);
end.

Комментариев нет:

Отправить комментарий