1. 1. Đếm dãy.
Cho số nguyên dương N. Hãy cho biết có bao nhiêu dãy số nguyên dương có tổng các phần tử
trong dãy bằng N.
Dữ liệu: Vào từ file văn bản COUNT.INP chứa duy nhất một số nguyên n <= 1018
Kết quả: Ghi ra file văn bản COUNT.OUT một số nguyên duy nhất là số dư của kết quả tìm
được khi chia cho 123456789.
COUNT.INP COUNT.OUT
3 4
Ví dụ
Giải thích: Có 4 dãy số nguyên dương có tổng bằng 3 đó là:(1;1;1), (1;2), (2;1), (3).
Pree Pascal
uses math;
const module = 123456789;
function dequy(k:int64):int64;
var
h:int64;
begin
if k=0 then exit(1);
if k=1 then exit(2);
h := dequy(k div 2) mod module;
if (k mod 2 = 0) then
exit(sqr(h mod module) mod module)
else
exit((h mod module)*( (h*2) mod module) mod module);
end;
procedure sol;
var
n:int64;
begin
readln(n);
if n=0 then writeln(0)
else writeln(dequy(n-1));
end;
2. begin
sol;
readln;
end.
C++
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 123456789;
ll n;
ll dequy(ll k)
{
if(k == 0) return 1;
if(k == 1) return 2;
ll h = dequy(k / 2) % N;
return k % 2 == 0 ? ((h % N) * (h % N)) % N : ((h % N) * ((h * 2) % N)) % N;
}
int main()
{
cin >> n;
n == 0 ? cout <<"0" : cout << dequy(n - 1);
return 0;
}
2. Tổng màng
Cho mảng A có N phần tử. Tính tổng dãy A đó
INPUT:
Gồm một dòng duy nhất chứa N + 1 số nguyên, có giá trị từ 0 tới 10^13-1, bao gồm các
số N (N<=1000000), a1, a2,..., aN.
OUTPUT: Kết quả bài toán
Pree Pascal
uses math;
var x,s,kq:ansistring;
i,k:longint;
q,p:qword;
function keke(r:ansistring;t:longint):ansistring;
var w:ansistring;
h,l:longint;
3. begin
w:='';
h:=t-length(r);
for l:=1 to h do
w:=w+'0';
keke:=w+r;
end;
function cong(a,b:ansistring):ansistring;
var d,n,vt,aa,bb,c:longint;
u,v,z,xe:ansistring;
begin
n:=max(length(a),length(b));
u:=keke(a,n);
v:=keke(b,n);
vt:=0;
xe:='';
for d:=n downto 1 do
begin
val(u[d],aa);
val(v[d],bb);
c:=(aa+bb+vt) mod 10;
vt:=(aa+bb+vt) div 10;
str(c,z);
xe:=z+xe;
end;
if vt=1 then
xe:='1'+xe;
exit(xe);
end;
function xuly(kt:ansistring):ansistring;
var rt:longint;
begin
for rt:=1 to length(kt) do
if kt[rt]='0' then
delete(kt,1,1)
else
exit(kt);
end;
begin
read(s);
while s[length(s)]=' ' do
begin
k:=length(s);
delete(s,k,1);
end;
s:=s+' ';
x:='';
p:=0;
for i:=1 to length(s) do
begin
if s[i]=' ' then
begin
kq:=cong(kq,x);
x:='';
inc(p);
end
else
x:=x+s[i];
end;
{x:='';i:=1;
while s[i]<>' ' do
begin
x:=x+s[i];