Professional Documents
Culture Documents
Đề Tỉnh Phú Thọ HSG Quốc Hương
Đề Tỉnh Phú Thọ HSG Quốc Hương
.
Đặt nếu khi đó
Min:=MaxN; b[0]:=0;
For i:=1 to n do b[i]:=-1;
Tong:=0;
For i:=1 to n do
Begin
Tong:=(Tong+a[i]) mod n;
If (b[Tong]>=0) And (i-b[Tong]<Min) then
Begin
Min:=i-b[Tong];
j:=b[Tong]+1;
End;
b[Tong]:=i;
End;
- Độ phức tạp của thuật toán là hiệu quả hơn nhiều phương pháp 1.
Chú ý: Không ảnh hưởng đến kết quả bài toán nếu thay .
CHƯƠNG TRÌNH
Bài 1. Tổng số nguyên liên tiếp
Phương pháp 1:
Const
Fi='BAI1.INP';
Fo='BAI1.OUT';
MaxN=50000;
Var
a: Array[0..MaxN] Of Longint;
n, k, h: Longint;
Procedure ReadFile;
Var
f: Text;
i: Longint;
Begin
Assign(f, Fi); Reset(f);
Readln(f,n);
For i:=1 to n do
Begin
Read(f,a[i]);
a[i]:=a[i] mod n;
End;
Close(f);
End;
Procedure xuly;
Var
i, j, l, Tong, TongTG: Longint;
Begin
a[0]:=0; k:=0; h:=0; TongTG:=0;
For l:=1 to n do
Begin
TongTG:=TongTG+a[l-1];
Tong:=TongTG;
For i:=1 to n-l+1 do
Begin
Tong:=Tong+a[i+l-1]-a[i-1];
If Tong mod n =0 then
Begin
k:=l; h:=i;
Exit;
End;
End;
End;
End;
Procedure WriteFile;
Var
f: Text;
i: Integer;
Begin
Assign(f, Fo); ReWrite(f);
Writeln(f,k,' ',h);
Close(f);
End;
Begin
ReadFile;
xuly;
WriteFile;
End.
Phương pháp 2:
Const
Fi='BAI1.INP';
Fo='BAI1.OUT';
MaxN=500000;
Var
a, b: Array[0..MaxN] Of Longint;
n, Min, j: Longint;
Procedure ReadFile;
Var
f: Text;
i: Longint;
Begin
Assign(f, Fi); Reset(f);
Readln(f,n);
For i:=1 to n do
Begin
Read(f,a[i]);
a[i]:=a[i] mod n;
End;
Close(f);
End;
Procedure Solve;
Var
i, Tong: Longint;
Begin
Min:=MaxN; b[0]:=0;
For i:=1 to n do b[i]:=-1;
Tong:=0;
For i:=1 to n do
Begin
Tong:=(Tong+a[i]) mod n;
If (b[Tong]>=0) And (i-b[Tong]<Min) then
Begin
Min:=i-b[Tong];
j:=b[Tong]+1;
End;
b[Tong]:=i;
End;
End;
Procedure WriteFile;
Var
f: Text;
i: Integer;
Begin
Assign(f, Fo); ReWrite(f);
If Min=MaxN then
Writeln(f,0,' ',0)
Else
Writeln(f,Min,' ',j);
Close(f);
End;
Begin
ReadFile;
Solve;
WriteFile;
End.
+ Tính tổng .
+ Giả sử dãy đã cho chia thành k đoạn con thoản mãn yêu cầu bài toán, khi đó Tong chia hết
cho k và .
- Phương pháp: Xét k từ n đến 1, kiểm tra k chia hết Tong không, nếu chia hết thử chia
thành các đoạn con có thỏa mãn yêu cầu bài toán không. Số k đầu tiên thỏa mãn chính là kết quả
của bài toán.
Tong:=0; PhuongAn:=1;
For i:=1 to n do Tong:=Tong + a[i];
For i:=n downto 1 do
If Tong mod i =0 then
Begin
k:=Tong div i;
t:=0;
For j:=1 to n do
Begin
If t=0 then t:=k;
If t<0 then Break;
t:=t-a[j];
End;
If t=0 then
Begin
PhuongAn:=i;
Break;
End;
End;
Cụ Thể
3.1. Chọn học sinh giỏi cấp tỉnh
Bài 1: Số đoạn con nhiều nhất
Const
Fi='DOANCON.IN0';
Fo='DOANCON.OUT';
MaxN=50000;
Var
a: Array[1..MaxN] Of Longint;
Tong, n, PhuongAn: Longint;
Procedure ReadFile;
Var
f: Text;
i: Longint;
Begin
Assign(f, Fi); Reset(f);
Readln(f,n);
For i:=1 to n do Read(f,a[i]);
Close(f);
End;
Procedure Solve;
Var
i, j, t, k: Longint;
Begin
Tong:=0; PhuongAn:=1;
For i:=1 to n do Tong:=Tong + a[i];
For i:=n downto 1 do
If Tong mod i =0 then
Begin
k:=Tong div i;
t:=0;
For j:=1 to n do
Begin
If t=0 then t:=k;
If t<0 then Break;
t:=t-a[j];
End;
If t=0 then
Begin
PhuongAn:=i;
Break;
End;
End;
End;
Procedure WriteFile;
Var
f: Text;
k, t, i, u, v: Longint;
Begin
k:= Tong div PhuongAn;
Assign(f, Fo); Rewrite(f);
Writeln(f, PhuongAn,' ',k);
t:=k; u:=1;
For i:=1 to n do
Begin
t:=t-a[i];
If t=0 then
Begin
t:=k;
Writeln(f,u,' ',i);
u:=i+1;
End;
End;
Close(f);
End;
Begin
ReadFile;
Solve;
WriteFile;
End.
Biến đổi
4.1. Chọn học sinh giỏi cấp tỉnh
Bài 1. BIẾN ĐỔI
Từ một số nguyên Y có thể biến đổi thành số nguyên X nhờ hai phép biến đổi sau:
- Phép biến đổi 1: Y=Y - X nếu Y>X;
- Phép biến đổi 2: Y=Y + 1 nếu Y<X.
Yêu cầu: Cho hai số nguyên X và Y. Có thể biến đổi Y thành X được hay không? Trong trường hợp
có thể, tìm tổng số phép biến đổi?
Dữ liệu: Vào từ file văn bản BIENDOI.INP gồm một dòng chứa 2 số nguyên X và Y.
Kết quả: Đưa ra file văn bản BIENDOI.OUT gồm một dòng ghi tổng số phép biến đổi tìm được
trong trường hợp có thể; số 0 nếu ban đầu X=Y; số -1 nếu không biến đổi được.
Ví dụ:
BIENDOI.INP BIENDOI.OUT
10 97 12
Hướng dẫn
Bài 1. BIẾN ĐỔI
Ta xét các trường hợp như sau:
- Nếu X>0:
+ Nếu Y>X ta thực hiện phép biến đổi 1: số phép biến đổi là Y Div X;
+ Nếu Y<X ta thực hiện phép biến đổi 2: số phép biết đổi là X–Y.
- Nếu X=0:
+ Nếu Y>0 ta thực hiện phép biến đổi 1: vô hạn lần (không thể biến đổi Y thành X);
+ Nếu Y=0 ta được kết quả bài toán;
+ Nếu Y<0 thì Y<X ta thực hiện phép biến đổi 2: số phép biết đổi là X–Y.
- Nếu X<0:
+ Nếu Y>0 ta thực hiện phép biến đổi 1: vô hạn lần (không thể biến đổi Y thành X);
+ Nếu Y=0 ta thực hiện phép biến đổi 1: vô hạn lần (không thể biến đổi Y thành X);
+ Nếu Y<0:
Nếu Y>X ta thực hiện phép biến đổi 1: vô hạn lần (không thể biến đổi Y thành X);
Nếu X=Y ta được kết quả bài toán;
Nếu Y<X ta thực hiện phép biến đổi 2: số phép biết đổi là X–Y.
{KQ: kết quả bài toán}
If X>0 then
Begin
KQ:=0;
If Y>X then
Begin
KQ:=KQ + Y Div X;
Y:=Y Mod X;
End;
KQ:=KQ + X - Y;
End;
If X=0 then
Begin
If Y>0 then KQ:=-1;
If Y=0 then KQ:=0;
If Y<0 Then KQ:=X - Y;
End;
If X<0 then
Begin
If Y>0 then KQ:=-1;
If Y=0 then KQ:=-1;
If Y<0 then
Begin
If Y>X then KQ:=-1;
If Y=X then KQ:=0;
If Y<X then KQ:=X - Y;
End;
End;
If Y=X then KQ:=0;
Procedure WriteResult;
Var
f: Text;
Begin
Assign(f,Fo); ReWrite(f);
Write(f,KQ);
Close(f);
End;
Begin
ReadFile;
Solve;
WriteResult;
End.
Phần tử lượng
Bài 1. Phân tử lượng
Const
Fi='H2O.INP';
Fo='H2O.OUT';
Var
a: Array['A'..'Z'] Of Longint;
PT: Set Of Char;
s: String;
KLPT: Longint;
Procedure Init;
Begin
Fillchar(a, Sizeof(a),0);
PT:=['H', 'O','N','C'];
End;
Procedure ReadFile;
Var
f: Text;
Begin
Assign(f, Fi); Reset(f);
Readln(f,s);
Close(f);
End;
Procedure Solve;
Var
i, Count, c: Integer;
Begin
i:=1;
While i<=Length(s) do
Begin
If s[i] In PT then
Begin
Count:=1;
If (i<Length(s)) And Not(s[i+1] In PT) then
Val(s[i+1], Count, c);
a[s[i]]:=a[s[i]]+Count;
End;
Inc(i);
End;
KLPT:=a['H']*1 + a['O']*16 + a['N']*14 + a['C']*12;
End;
Procedure WriteFile;
Var
f: Text;
Begin
Assign(f, Fo); Rewrite(f);
Writeln(f,KLPT);
Close(f);
End;
Begin
ReadFile;
Init;
Solve;
WriteFile;
End.
Tìm kiếm
5.1. Chọn học sinh giỏi cấp tỉnh
Bài 1: Ghép xâu
Một xâu ký tự S có thể được xây dựng từ một hoặc một số xâu ký tự A i cho trước bằng cách
ghép chúng với nhau. Mỗi xâu A i có độ dài không quá 10 ký tự, không chứa ký tự trắng và có thể
dùng nhiều lần trong việc xây dựng xâu S.
Ví dụ: Xâu S= “Kythichonhocsinhgioi” có thể được xây dựng từ 4 xâu A i là: A1=”Ky”;
A2=”thi”; A3=”chonhoc”; A4=”sinhgioi”.
Bài toán đặt ra: Cho xâu S và N xâu A i ; i = 1, 2, 3, …, N; N ≤ 100. Xâu S có thể được xây
dựng từ các xâu Ai hay không? Trường hợp có thể, hãy chỉ ra một cách xây dựng xâu S?
Dữ liệu vào: File văn bản có tên: BL1.INP bao gồm: dòng thứ nhất ghi xâu S; dòng thứ hai
ghi số N; N dòng tiếp theo mỗi dòng ghi xâu Ai.
Kết quả ghi ra file văn bản có tên BL1.OUT theo quy cách:
- Nếu xâu S không xây dựng được từ các xâu Ai đã cho thì ghi số 0;
- Nếu xâu S được xây dựng từ các xâu A i thì ghi chỉ số của các xâu A i tìm được trong một
cách xây dựng theo thứ tự. Hai số trên một dòng cách nhau một ký tự trắng.
Ví dụ:
BL1.INP BL1.OUT BL1.INP BL1.OUT
Kythihocsinhgioi 2153 Kythihocsinhgioi 0
5 4
thi Ky
Ky hocsinh
gioi gioi
ythi thichon
hocsinh
Bài 3: Tìm kiếm
Cho dãy số gồm N số nguyên. Tìm phần tử có giá trị tuyệt đối lớn thứ k trong dãy.
Dữ liệu vào: File văn bản BL3.INP có cấu trúc:
- Dòng đầu ghi 2 số nguyên dương N và k. ( 0 < k ≤ N ≤ 10000);
- Các dòng tiếp theo ghi N số nguyên. Hai số trên một dòng cách nhau một ký tự trắng.
Kết quả: File văn bản BL3.OUT ghi chỉ số của phần tử có giá trị tuyệt đối lớn thứ k trong
dãy. Nếu có nhiều phần tử như vậy thì chọn phần tử có chỉ số nhỏ nhất. Nếu không có phần tử nào
thoả mãn thì ghi số 0.
Ví dụ:
BL3.INP BL3.OUT BL3.INP BL3.OUT
9 2 7 64 0
17 -25 30 200 75 60 -81 81 8 -10 10 9 8 8
50
Bài 3: Tìm kiếm
Const
Fi='BL3.Inp';
Fo='BL3.Out';
MaxN=10000;
Var
a, b: Array[1..MaxN] Of Integer;
n, k, ak: Integer;
Procedure ReadFile;
Var
f: Text;
i: Integer;
Begin
Assign(f,Fi); Reset(f);
Readln(f,n,k);
For i:=1 to n do Read(f, a[i]);
Close(f);
End;
Procedure Solve;
Var
Key, Tg: Integer;
i, j: Integer;
Begin
Key:=-1;
j:=0; ak:=0; Tg:=-1;
For i:=1 to n do
Begin
If b[i]<>Key then
Begin
j:=j+1;
Key:=b[i];
End;
If j=k then
Begin
Tg:=b[i];
Break;
End;
End;
If Tg>0 then
For i:=1 to n do
If Abs(a[i])=Tg then
Begin
ak:=i;
Break;
End;
End;
Procedure WriteFile;
Var
f: text;
Begin
Assign(f, Fo); Rewrite(f);
Writeln(f,ak);
Close(f);
End;
Begin
ReadFile;
Sort;
Solve;
WriteFile;
End.
- Tính mảng A[i] số các số có i chữ số với chữ số tận cùng khác 0: (cơ số
k).
- Tính mảng T[i] số các số thỏa mãn yêu cầu bài toán có n chữ số: T[i]=A[i-1]+A[i-3]+....
(A[i-1]: số các số có i chữ số với số các chữ số 0 tận cùng là 1, A[i-3]: số các số có i chữ số với số
các chữ số 0 tận cùng là 3, ...).
Nhận xét: ta có T[i]=k.T[i-1] nếu i lẻ và T[i]=k.T[i-1]+k-1 nếu i chẵn.
- Tính mảng L[i]=T[1]+T[2]+...+T[i] các khoảng của mảng T[i] từ đó đưa ra được số cần
tìm có bao nhiêu chữ số.
Từ các mảng phương án A[i], T[n], L[i] và nhận xét ta xác định số thứ n mà Minh yêu thích
ở hệ cơ số k.
{MaxM=100000000000000000; Max=100;}
Tg:=k-1; a[1]:=0; MaxN:=1;
{Tính mảng a}
Repeat
Inc(MaxN);
a[MaxN]:=Tg;
For i:=1 to MaxN-1 do a[MaxN]:=a[MaxN]-a[i];
Tg:=Tg*k;
Until Tg>MaxM;
{Tính mảng t}
For i:=1 to MaxN do
Begin
t[i]:=a[i];
j:=i-2;
While j>0 do
Begin
t[i]:=t[i]+a[j];
j:=j-2;
End;
End;
{Tính mảng l}
L[0]:=0;
For i:=1 to MaxN do l[i]:=l[i-1]+t[i];
{Lặp đếm phương án}
While n>0 do
Begin
m:=1;
While l[m]<n do Inc(m);
m:=m-1;
c:=l[m]; j:=0;
While n>c do
Begin
Inc(j);
n:=n-c;
If m mod 2 = 1 then n:=n-1;
End;
Tg:=j;
For i:=1 to m do Tg:=Tg*k;
KQ:=KQ+Tg;
End;
Bài 3: Tìm kiếm
Phương pháp giải:
- Sắp xếp theo thứ tự giảm dần theo giá trị tuyệt đối của các phần tử;
- Xác định phần tử lớn thứ k theo giá trị tuyệt đối trong dãy;
- Đưa ra kết quả.
Key:=-1;
j:=0; ak:=0; Tg:=-1;
For i:=1 to n do
Begin
If b[i]<>Key then
Begin
j:=j+1; Key:=b[i];
End;
If j=k then
Begin
Tg:=b[i]; Break;
End;
End;
If Tg>0 then
For i:=1 to n do
If Abs(a[i])=Tg then
Begin
ak:=i; Break;
End;
Procedure ReadFile;
Var
f: Text;
Begin
Assign(f, Fi); Reset(f);
Readln(f,n);
Close(f);
End;
Procedure Solve;
Var
f: Text;
i1, i2, i3, i4, t: Longint;
Begin
Assign(f, Fo); Rewrite(f);
For i1:=1 to Round(Sqrt(n/4)) do
For i2:=i1 to Round(Sqrt((n-i1*i1)/3)) do
For i3:=i2 to Round(Sqrt((n-i1*i1-i2*i2)/2)) do
Begin
t:=n-i1*i1-i2*i2-i3*i3;
i4:=Round(Sqrt(t));
If i4*i4=t then
Begin
Writeln(f,i1,' ',i2,' ',i3,' ',i4);
Close(f);
Halt;
End;
End;
Writeln(f,-1);
Close(f);
End;
Begin
ReadFile;
Solve;
End.
+
Procedure CongDao;
Var
i, m: Integer;
Tg: Longint;
Begin
m:=na div 2;
If m*2<>na then Inc(m);
For i:=1 to m do
Begin
a[i]:=a[i]+a[na-i+1];
a[na-i+1]:=a[i];
End;
Tg:=0;
For i:=1 to na do
Begin
Tg:=Tg+a[i];
a[i]:=Tg mod 10;
Tg:=Tg div 10;
End;
While Tg>0 do
Begin
Inc(na);
a[na]:=Tg mod 10;
Tg:=Tg div 10;
End;
End;
- Lặp tìm kết quả
Procedure Solve;
Begin
While fDoiXung=False do CongDao;
End;
Câu 2: Số đối xứng
Const
Fi='CAU2.INP';
Fo='CAU2.OUT';
MaxN=100000;
Var
n: Int64;
a: Array[1..MaxN] Of Longint;
na: Integer;
Procedure ReadFile;
Var
f: Text;
Begin
Assign(f, Fi); Reset(f);
Readln(f,n);
Close(f);
End;
Procedure Init;
Var
i, c: Integer;
s: String;
Begin
na:=0;
Str(n,s);
For i:=1 to Length(s) do
Begin
Inc(na);
Val(s[i],a[na],c);
End;
End;
Procedure CongDao;
Var
i, m: Integer;
Tg: Longint;
Begin
m:=na div 2;
If m*2<>na then Inc(m);
For i:=1 to m do
Begin
a[i]:=a[i]+a[na-i+1];
a[na-i+1]:=a[i];
End;
Tg:=0;
For i:=1 to na do
Begin
Tg:=Tg+a[i];
a[i]:=Tg mod 10;
Tg:=Tg div 10;
End;
While Tg>0 do
Begin
Inc(na);
a[na]:=Tg mod 10;
Tg:=Tg div 10;
End;
End;
Procedure Solve;
Begin
While fDoiXung=False do CongDao;
End;
Procedure WriteFile;
Var
f: Text;
i: Integer;
Begin
Assign(f,Fo); Rewrite(f);
For i:=1 to na do Write(f,a[i]);
Close(f);
End;
Begin
ReadFile;
Init;
Solve;
WriteFile;
End.
(do ngược lại mâu thuẫn với ) gợi ý cho ta cách đếm ước như sau:
For i:=1 to Sqrt(n) do
If n mod i = 0 then
Begin
If i<>n div i then
Count:=Count+2
Else Count:=Count+1;
End;
Câu 1: Đếm ước
Const
Fi='CAU1.INP';
Fo='CAU1.OUT';
Var
n, Count: Int64;
Procedure ReadFile;
Var
f: Text;
Begin
Assign(f, Fi); Reset(f);
Readln(f,n);
Close(f);
End;
Procedure Solve;
Var
i, m: Longint;
Begin
Count:=0;
m:=Round(Sqrt(n));
For i:=1 to m do
If n mod i = 0 then
Begin
If i<>n div i then
Count:=Count+2
Else Count:=Count+1;
End;
End;
Procedure WriteFile;
Var
f: Text;
Begin
Assign(f, Fo); Rewrite(f);
Writeln(f,Count);
Close(f);
End;
Begin
ReadFile;
Solve;
WriteFile;
End.
Câu 2: Số nhỏ nhất
Cho dãy số nguyên dương: a1, a2, …, an (1 ≤ n ≤109; 1 ≤ ai < 106; i = 1, 2, 3, ..., n).
Yêu cầu: Tìm số nguyên dương nhỏ nhất không xuất hiện trong dãy số đã cho.
Dữ liệu: Vào từ file văn bản CAU2.INP
Dòng 1 chứa số nguyên dương n (1 ≤ n ≤ 109);
Dòng 2 chứa n số nguyên dương a1, a2,… , an (1≤ ai < 106). Các số cách nhau một dấu cách.
Kết quả: Đưa ra file văn bản CAU2.OUT gồm một dòng chứa số nguyên dương nhỏ nhất tìm được.
Ví dụ:
CAU2.INP CAU2.OUT CAU2.INP CAU2.OUT
3 1 8 5
263 1 30 4 65 2 37 27 3
Procedure Init;
Begin
Fillchar(a, Sizeof(a), True);
End;
Procedure ReadFile;
Var
f: Text;
n, i, ai: Longint;
Begin
Assign(f, Fi); Reset(f);
Readln(f,n);
For i:=1 to n do
Begin
Read(f, ai);
a[ai]:=False;
End;
Close(f);
End;
Procedure Solve;
Var
i: Longint;
Begin
Min:=MaxAi;
For i:=1 to MaxAi do
If a[i] then
Begin
Min:=i;
Break;
End;
End;
Procedure WriteFile;
Var
f: Text;
Begin
Assign(f, Fo); Rewrite(f);
Writeln(f,Min);
Close(f);
End;
Begin
Init;
ReadFile;
Solve;
WriteFile;
End.
Câu 4: Tìm số
Sau ngày thi thứ nhất, Minh rất vui vẻ vì mình làm bài rất tốt. Với động lực đó, Minh càng
hăng say học tập. Hôm nay, Minh bắt tay vào nghiên cứu số Fibonaci. Sử dụng công thức tổng quát
của dãy số Fibonaci:
Minh lần lượt tính các số của dãy số Fibonaci và viết chúng cạnh nhau từ trái qua phải tạo
thành một dãy số vô hạn: 112358132134... Minh có một câu hỏi: với dãy số vô hạn được tạo bằng
cách trên, thì chữ số thứ K tính từ trái qua phải là chữ số nào. Các bạn hãy lập trình giúp Minh trả
lời câu hỏi trên.
Yêu cầu: Cho số tự nhiên K, hãy tìm chữ số thứ K (tính từ trái qua phải) của dãy số vô hạn mà
Minh tạo ra.
Dữ liệu: Vào từ file văn bản CAU4.INP gồm một dòng chứa một số tự nhiên K (1 ≤ K ≤ 109).
Kết quả: Đưa ra file văn bản CAU4.OUT gồm một dòng ghi chữ số thứ K của dãy số vô hạn mà
Minh tạo ra.
Ví dụ:
CAU4.INP CAU4.OUT CAU4.INP CAU4.OUT
1 1 11 3
Câu 4: Tìm số
Const
Fi='CAU4.INP';
Fo='CAU4.OUT';
MaxN=10000;
CoSo=100000000000000000;
LCoSo=17;
Var
a: Array[1..2,0..MaxN] Of Int64;
k, i1, i2: Longint;
KQ: String;
Procedure Init;
Begin
Fillchar(a, Sizeof(a), 0);
i1:=2; i2:=1;
End;
Function Fn(n: Int64): Longint;
Var
s: String;
Begin
Str(n, s);
Fn:=Length(s);
End;
Procedure ReadFile;
Var
f: Text;
Begin
Assign(f, Fi); Reset(f);
Readln(f,k);
Close(f);
End;
Procedure Solve;
Var
i, n, j, la: Longint;
Tg: Int64;
s: String;
Begin
a[1,1]:=1; a[1,0]:=1;
a[2,1]:=1; a[2,0]:=1;
If k<=2 then
Begin
KQ:='1';
Exit;
End;
k:=k-2;
Repeat
i:=i1; i1:=i2; i2:=i;
n:=a[i2,0];
Tg:=0;
For j:=1 to n do
Begin
a[i1,j]:=Tg+a[i1,j]+a[i2,j];
Tg:=a[i1,j] div CoSo;
a[i1,j]:=a[i1,j] mod CoSo;
End;
While Tg>0 do
Begin
Inc(n);
a[i1,n]:=Tg mod CoSo;
Tg:=Tg div CoSo;
End;
a[i1,0]:=n;
la:=Fn(a[i1,n])+(n-1)*lCoSo;
If k<=la then
Begin
Str(a[i1,n],s);
If k<=Length(s) then
Begin
KQ:=s[k];
Exit;
End;
k:=k-Length(s);
For j:=n-1 downto 1 do
Begin
Str(a[i1,j],s);
For i:=Length(s)+1 to lCoSo do s:='0' + s;
If k<=lCoSo then
Begin
KQ:=s[k];
Exit;
End;
k:=k-lCoSo;
End;
End;
k:=k-la;
Until k<=0;
End;
Procedure WriteFile;
Var
f: Text;
Begin
Assign(f, Fo); Rewrite(f);
Writeln(f,KQ);
Close(f);
End;
Begin
Init;
ReadFile;
Solve;
WriteFile;
End.