Lời giải LATGACH4 – Lát gạch 4
Nguồn bài http://vn.spoj.com/problems/LATGACH4/ Đề bài LATGACH4 spoj Cho một hình chữ nhật kích thước 2xN (1<=N<10^9). Hãy đếm số cách lát các viên gạch nhỏ kích thước 1×2 và 2×1 vào hình trên sao cho không có phần nào của các viên gạch nhỏ thừa ra ngoài, cũng ...
Nguồn bài http://vn.spoj.com/problems/LATGACH4/
Đề bài LATGACH4 spoj
Cho một hình chữ nhật kích thước 2xN (1<=N<10^9). Hãy đếm số cách lát các viên gạch nhỏ kích thước 1×2 và 2×1 vào hình trên sao cho không có phần nào của các viên gạch nhỏ thừa ra ngoài, cũng không có vùng diện tích nào của hình chữ nhật không được lát.
Input
Gồm nhiều test, dòng đầu ghi số lượng test T ( T<=100 ). T dòng sau mỗi dòng ghi một số N.
Output
Ghi ra T dòng là số cách lát tương ứng lấy phần dư cho 111539786.
Example
Input:
3
1
2
3
Output:
1
2
3
Code tham khảo LATGACH4 spoj
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | const fi='; sodu = 111539786; nmax = 1000000; var f:text; A:array[0..nmax] of longint; T,ti:word; i,tam:longint; function fibo(n:int64):int64; var k1,k2:int64; begin if n<=nmax then exit(a[n] mod sodu); if n mod 2 = 0 then begin k1:=fibo(n div 2) mod sodu; k2:=fibo(n div 2 - 1) mod sodu; fibo:=(((k1*k1) mod sodu )+ ((k2*k2) mod sodu)) mod sodu; end else fibo:= (fibo(n div 2)*((fibo(n div 2 + 1) + fibo(n div 2 - 1)) mod sodu)) mod sodu; end; begin A[1]:=1; a[2]:=2; for i:=3 to nmax do a[i]:=(a[i-1]+a[i-2]) mod sodu; assign(f,fi); reset(f); readln(f,t); for ti:=1 to t do begin readln(f,tam); writeln(fibo(tam)); end; close(f); end. |