You are on page 1of 6

ĐÁP ÁN

CÂU 1.
const
tfi = 'FSTR.INP';
tfo = 'FSTR.OUT';
var
fi,fo : text;
N : integer;
m : integer;
SA,SB,SR : string;
fa,fb,fc,
da,ca,db,cb,
dc,cc : string;
a,b,c : extended;

procedure Docdl;
begin
assign(fi,tfi); reset(fi);
readln(fi,N);
readln(fi,SA);
readln(fi,SB);
readln(fi,SR);
close(fi);
m:=length(SR);
end;

function Dem(s1,s: string): extended;


var d: extended;
k: integer;
begin
d:=0;
while pos(s1,s)>0 do
begin
k:=pos(s1,s);
d:=d+1;
delete(s,1,k);
end;
Dem:=d;
end;

function Chung: real;


begin
fc:=ca+db;
delete(fc,1,1);
delete(fc,length(fc),1);
Chung:=Dem(sr,fc);
end;

procedure Tinh;
var i: integer;
begin
fa:=sa;
fb:=sb;
a:=Dem(sr,sa);
b:=Dem(sr,sb);
i:=2;
while (i<=n) and (length(fa)<=m) do
begin
fc:=concat(fa,fb);
c:=Dem(sr,fc);
fa:=fb;
fb:=fc;
a:=b;
b:=c;
inc(i);
end;
if i<=n then
begin
da:=copy(fa,1,m);
ca:=copy(fa,length(fa)-m+1,m);
db:=copy(fb,1,m);
cb:=copy(fb,length(fb)-m+1,m);
while i<=n do
begin
c:=a+b+Chung;
dc:=da; cc:=cb;
a:=b;
b:=c;
da:=db; ca:=cb;
db:=dc; cb:=cc;
inc(i);
end;
end;
end;

procedure Inkq;
begin
assign(fo,tfo); rewrite(fo);
writeln(fo,c:0:0);
close(fo);
end;
BEGIN

Docdl;
Tinh;
Inkq;
END.

BÀI 2.
#include <algorithm>
#include <cstdio>
using namespace std;
#define MAX 200
const int oo = 1000000;
int n, m;
int g[MAX][MAX];
char done[MAX][MAX];
int dist[MAX][MAX];
int main(void) {
FILE *nhap, *xuat;
nhap =fopen("election.inp", "r");
fscanf(nhap,"%d%d", &n, &m);
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
g[i][j] = i == j ? 0 : oo;
for (int i = 0; i < m; ++i) {
int u, v;
fscanf(nhap,"%d%d", &u, &v);
g[--u][--v] = 1;
}
for (int k = 0; k < n; ++k)
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) {
dist[i][j] = oo;
done[i][j] = 0;
}
dist[1][1] = 1;
for (;;) {
int a = -1, b = -1;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) {
if (done[i][j]) continue;
if (a == -1 || dist[i][j] < dist[a][b]) { a = i; b = j; }
}
if (a == 0 && b == 0) {
break;
}
done[a][b] = 1;
for (int c = 0; c < n; ++c)
for (int d = 0; d < n; ++d) {
if (c == a || c == b || d == a || d == b) continue;
dist[c][d] = min(dist[c][d], dist[a][b] + g[b][c] + g[c][d] + g[d][a] - 1);
}
}
xuat = fopen("election.out","w");

fprintf(xuat,"%d\n", dist[0][0]);
return 0;
}

Bài 3.
const fi='PUTEVI.inp';
fo='PUTEVI.out';
maxn=100100;
modu=1000000007;
type dslk=^tp;
tp=record
u,ts:longint;
next:dslk;
end;
var f1:array[1..maxn,0..2] of int64;
ds:array[1..maxn] of dslk;
free:Array[1..maxn] of boolean;
n:longint;
f:Text;

procedure nhap;
var i,uu,vv,cc:longint; tg:dslk;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do ds[i]:=nil;
for i:=1 to n-1 do
begin
readln(f,uu,vv,cc);
new(tg);
tg^.u:=vv; tg^.ts:=cc; tg^.next:=ds[uu];
ds[uu]:=tg;
new(tg);
tg^.u:=uu; tg^.ts:=cc; tg^.next:=ds[vv];
ds[vv]:=tg;
end;
close(f);
end;

procedure dfs(uu:longint);
var cc,vv,tt:longint; tg:dslk;
begin
tg:=ds[uu];
while tg<>nil do
begin
vv:=tg^.u;
cc:=tg^.ts;
if free[vv] then
begin
free[vv]:=false;
dfs(vv);
tt:=(cc+cc*f1[vv,1]) mod modu;
f1[uu,2]:=(f1[uu,2]+f1[uu,1]*tt) mod modu;
f1[uu,1]:=(f1[uu,1]+tt) mod modu;
f1[uu,0]:=(f1[uu,0]+f1[vv,1]+F1[vv,0]+f1[vv,2]) mod modu;
end;
tg:=tg^.next;
end;
end;
procedure inkq;
var res:int64;
begin
assign(f,fo); rewrite(f);
fillchar(free,sizeof(Free),true);
fillchar(F1,sizeof(f1),0);
free[1]:=false;
dfs(1);
res:=(f1[1,0]+f1[1,1]+f1[1,2]) mod modu;
writeln(f,res);
close(f);
end;
begin
nhap;
inkq;
end.

You might also like