Tải bản đầy đủ (.docx) (51 trang)

Các bài Code kỹ thuật lập trình PTIT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (344.4 KB, 51 trang )

GTBT001 - Đa thức tổng
Đề bài
Với số nguyên dương n(1≤n≤20) và số thực x. Tính giá trị biểu thức:
n


S(x,n)=
k =1

xk
k

∑j
i=1

Dữ liệu vào
- Số lượng testcase t (t≥1).
- Với mỗi testcase, nhập vào 2 số theo tuần tự số nguyên dương n và số thực x.
Mỗi số cách nhau bởi ít nhất một dấu cách.

Dữ liệu ra
- Mỗi dòng tương ứng với một testcase ghi một giá trị của S(x,n) với 3 chữ số
sau dấu phẩy.

Ví dụ
Input #1

Output #1

2
10 0.0


2 1

0.000
1.333

Code
#include<bits/stdc++.h>
using namespace std;
int main(){
int test;
cin>>test;
while(test--){
int n;
float x;
cin >> n >> x;
float sum=0;
for(int k=1; k<=n; k++){
float s=pow(x,k)/((k+1)*k/2);
sum+=s;
}
cout << fixed << setprecision(3) << sum << endl;


}
}

GTBT002 - Biểu thức tổng giai thừa
Đề bài
Với số nguyên dương n (1≤n≤20) và số thựcx. Tính giá trị biểu thức:
n


S(x,n)¿ ∑
k=1

xk
k!

Dữ liệu vào
- Số lượng testcase t(t≥1).
- Với mỗi testcase, nhập vào 2 số theo tuần tự số nguyên dương n và số thực x.
Mỗi số cách nhau bởi ít nhất một dấu cách.

Dữ liệu ra
- Mỗi dòng tương ứng với một testcase ghi một giá trị của S(x,n)với 3 chữ số
sau dấu phẩy.

Ví dụ
Input #1
2
10 0
2

1.0

Output #1
0.000
1.

Code:
#include<bits/stdc++.h>

using namespace std;
int main(){
int t;
cin >>t;
while(t--){


short n;
float x;
float gt=1;
float sum=0;
cin>>n>>x;
for(int k=1;k<=n;k++){
gt*=k;
sum+=(pow(x,k)/gt);
}
cout<}
}

GTBT003 - Biểu thức căn-giai thừa
Đề bài
Với số nguyên n(1≤n≤20). Tính giá trị biểu thức:

S(n)=n+ 1 n !+ √n ( n−1 ) ! +… √3 2!+ √1 !



(S(n) có n dấu căn).


Dữ liệu vào
- Số lượng testcase t(t≥1).
- Với mỗi testcase, nhập vào một số nguyên dương n.

Dữ liệu ra
Mỗi dòng tương ứng với một testcase ghi một giá trị củaS(n)với 3 chữ số sau
dấu phẩy.

Ví dụ
Input #1

Output #1

2
1
2

1.000
1.442

Code


#include<bits/stdc++.h>
using namespace std;
int main(){
int test;
cin>>test;
while(test--){
short n;

cin>>n;
float sum=0;
float gt=1;
for(int i=1;i<=n;i++){
gt*=i;
sum = pow((gt+sum) * 1.0, 1.0/(i + 1));
}
cout<}
}

GTBT005 - Biểu thức sin(x)
Đề bài
Với số thực x, tính giá trị hàm sin(x) với độ chính xác
n

Sin(x) ¿ ∑ (−1)k
k=0

10-5 theo cơng thức:

x 2 k+1
(⃗n ∞)
( 2 k +1 ) !

Sử dụng số PI =3.14159265358979323846

Dữ liệu vào
- Số lượng testcase t(t≥1).
- Với mỗi testcase, nhập vào một số thực x.


Dữ liệu ra
- Mỗi dòng tương ứng với một testcase ghi một giá trị của sin(x) với 6 chữ số
sau dấu phẩy.

Ví dụ
Input #1

Output #1

5
0

0.000000


6
45
3
17

-0.279413
0.850904
0.141120
-0.961398

Code
#include<bits/stdc++.h>
#define pi 3.14159265358979323846
#define epsilon 0.00001

using namespace std;
int main() {
int test;
cin >> test;
while (test--) {
float x;
cin >> x;
while (x > (2 * pi)){
x -= 2 * pi;
}
float mau = 1.0;
float tu = x;
float sin = x;
int dau = -1;
for (int i = 1; (tu / mau) > epsilon; i++) {
tu *= x * x;
mau *= (2 * i) * (2 * i + 1);
sin += dau * (tu / mau);
dau = -dau;
}
cout << setprecision(6) << fixed << sin << endl;
}
}

DEC2BIN - Đổi hệ thập phân sang hệ nhị phân
Đề bài


Hệ thập phân (cơ số 10) là hệ cơ số mà con người chúng ta sử dụng hàng ngày
trong cuộc sống. Thế nhưng, chiếc máy tính của chúng ta lại chỉ có thể làm việc

với hệ nhị phân (cơ số 2).
Ví dụ: 8_{10} = 1000_{2} = 1*2^3 + 0*2^2 + 0*2^1 + 0*2^0
Cho một số nguyên dương n trong hệ cơ số 10 (1≤n≤10^18), hãy viết số đó
trong hệ cơ số 2 (hệ nhị phân).

Dữ liệu vào
Số lượng testcase t (t≥1). Với mỗi bộ test, nhập vào số nguyên dương n.

Dữ liệu ra
Với mỗi số nguyên dương n trong hệ thập phân, in ra trên một dòng xâu nhị
phân biểu diễn số đó trong hệ nhị phân (khơng bắt đầu bởi số 0).

Ví dụ
Input #1

Output #1

3
5
7
10

101
111
1010

Code
#include<bits/stdc++.h>
using namespace std;
int main(){

int test;
cin>>test;
while(test--){
vector<long long> a;
long long n;
cin>>n;
while(n>0){
a.push_back(n%2);
n=n/2;
}
for(int i=a.size()-1;i>=0;i--){
cout<cout<

}
}

NGTO001 - Đếm số nguyên tố hoàn toàn
Đề bài
Số nguyên tố hoàn toàn (full prime) là số nguyên tố mà mỗi chữ số của nó cũng
là số nguyên tố. Hãy đếm số các số nguyên tố hoàn toàn nhỏ hơn hoặc bằng
một giá trị nguyên dương n cho trước (1≤n≤106).

Dữ liệu vào
Số lượng testcase t (t≥1). Với mỗi testcase, nhập vào một số nguyên dương n.

Dữ liệu ra
Mỗi dòng tương ứng với một testcase ghi số lượng số nguyên tố hồn tồn tìm
được.


Ví dụ
Input #1

Output #1

2
1 100

0
8

Code
#include<bits/stdc++.h>
using namespace std;
int prime[1000001];
void check(){
for(int i=0;i<=1000000;i++)
prime[i]=1;
prime[0]=0;
prime[1]=0;
for(int i=2;i<=1000;i++){
if(prime[i]){
for(int j=i*i;j<=1000000;j+=i)
{
prime[j]=0;


}
}

}
}
int kt(int m ){
while(m!=0){
int a=m%10;
if(prime[a]==0) return 0;
m/=10;
}
return 1;
}
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
check();
int count=0;
for(int i=1;i<=n;i++){
if(kt(i)==1&&prime[i]==1){
count++;
}
}
cout<}
}

COBAN004 - Số đối xứng
Đề bài
Một số nguyên dương được gọi là số đối xứng nếu khi viết các chữ số của nó

(trong hệ thập phân) theo thứ tự ngược lại ta vẫn được chính số đó. Cho số
nguyên dương k (1 ≤ k ≤ 18), đếm xem có bao nhiêu số đối xứng có k chữ số.

Dữ liệu vào
Số lượng testcase t (t≥1). Với mỗi testcase, nhập vào một số nguyên dương k.

Dữ liệu ra
Với mỗi số nguyên dương k, ghi ra trên một dòng số lượng số đối xứng có k chữ
số.

Ví dụ


Input #1

Output #1

2
1
2

9
9

Code

COBAN005 - Hàm mũ số lớn
Đề bài
Cho hai số nguyên a và b (1≤a, b≤10^{100}10100). Hãy tính kết quả x
=a^bab chia lấy dư cho MOD, với MOD=10^9109+7.


Dữ liệu vào
Số lượng testcase t (t≥1). Với mỗi testcase, nhập vào hai số nguyên dương a và
b.

Dữ liệu ra
Mỗi dòng tương ứng với một testcase ghi kết quả tìm được.


Ví dụ
Input #1

Output #1

1
2 3

8

Gợi ý
Sử dụng cơng thức lấy MOD đối với MOD ngun tố và cơng thức tính MOD:
1) a^b MOD m = (a MOD m)^(b MOD (m-1)) MOD m
2) abcde MOD m = (a MOD m)*10 + (bcde MOD m)

Code
#include <bits/stdc++.h>
using namespace std;
const int Mod = 1e9 + 7;
typedef long long ll;
ll du(string a, int Mod){

ll r = 0;
for (int i=0;ir = r * 10 + a[i] - '0';
r %= Mod;
}
return r;
}
ll pow(ll a, ll b){
//tinh luy thua nhi phan
ll res = 1;
while (b){
if (b%2==1){
res *= a;
res %= Mod;
}
a *= a;
a %= Mod;
b/=2;
}
return res;
}
int main(){
int test;
cin >>test;
while (test--){


string a,b;
cin >> a >> b;
ll nA = du(a,Mod);

ll nB = du(b,Mod - 1);
cout << pow(nA,nB) <}
return 0;
}

UOCSO004 - Ước nguyên tố
Đề bài
Cho một số nguyên dương x thỏa mãn

1018 ≥ x ≥ 2. Hãy kiểm tra xem tích các

ước ngun tố của x có nhỏ hơn x hay khơng. Trong trường hợp x chỉ có một
ước nguyên tố, ta định nghĩa tích các ước nguyên tố của x chính là ước nguyên
tố duy nhất của x.

Dữ liệu vào
Số lượng testcase t (t≥1). Với mỗi testcase, nhập vào một số nguyên dương x.

Dữ liệu ra
Mỗi dòng tương ứng với một testcase ghi chữ YES nếu kết quả kiểm tra đúng,
nếu khơng thì ghi chữ NO.

Ví dụ
Input #1

Output #1

3
2

3
4

NO
NO
YES

Code
#include<bits/stdc++.h>
using namespace std;
bool check(long long n){
if(n<2){
return false;
}


// dem thua so nguyen to
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
int dem=0;
while(n%i==0){
n/=i;
dem++;
if(dem >1) return true;
}
}
}
return false;
}
int main(){

int test;
cin >>test;
while (test--){
long long n;
cin >> n;
if(check(n)==true){
cout<< "YES" <}
else cout<< "NO" <}
return 0;
}

COBAN007 - M chữ số đầu trong luỹ thừa
Đề bài
Cho ba số nguyên dương n, k và m (1≤n≤1018,
chữ số đầu tiên trong kết quả tính

0≤k≤103,1≤M≤18). Hãy tìm m

nk.

Dữ liệu vào
Số lượng testcase t (t≥1). Với mỗi testcase, nhập vào ba số nguyên dương n, k,
m.

Dữ liệu ra
Mỗi dòng tương ứng với một testcase ghi số m chữ số đầu tiên tìm được.



Ví dụ
Input #1

Output #1

2
2 5 1
2345 3 3

3
128

Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
// Tim a^b modulo M
ll modPower(ll a, ll b, ll M) {
ll res = 1;
while (b) {
if (b & 1)
res = res * a % M;
a = a * a % M;
b >>= 1;
}
return res;
}
// Tim first va last
// M chu so tu N^K
void findFirstAndLastM(ll N, ll K, ll M) {

// Tinh M chu so cuoi
// Tinh M chu so dau
ll firstM;
double y = (double)K * log10(N * 1.0);
// Extract the number after decimal
y = y - (ll)y;
// Tim 10 ^ y
double temp = pow(10.0, y);
// Move the Decimal Point M - 1 digits forward
firstM = temp * (1LL) * pow(10, M - 1);
cout << firstM <}
int main()
{
int test;
cin >> test;
while(test--) {


ll N, K, M;
cin >> N >> K >> M;
findFirstAndLastM(N, K, M);
}
return 0;
}

COBAN008 - Tổng hai số lớn
Đề bài
Cho hai số ngun khơng âm a và b có số chữ số khơng q 100. Hãy tính tổng
hai số.


Dữ liệu vào
Số lượng testcase t (t≥1). Với mỗi testcase, nhập vào hai số ngun khơng âm
a và b.

Dữ liệu ra
Mỗi dịng tương ứng với một testcase ghi kết quả tổng tìm được.

Ví dụ
Input #1

Output #1

2
1 1
12345 54321

2
66666

Code
#include <bits/stdc++.h>
using namespace std;
int main() {
int test;
cin>>test;
while(test--){
string a, b;
cin >>a>>b;
while (a.size() < b.size())

while (a.size() > b.size())

a = '0' + a;
b = '0' + b;


string res = "";
int num = 0;
string rem = "0";
for (int i = a.size() - 1; i >= 0; i--) {
num = (int)a[i] + (int)b[i] + (int)rem[0] - '0' * 3;
if (num > 9) {
res += (char)(num % 10 + '0');
rem = (char)(num / 10 + '0');
} else {
res += (char)(num + '0');
rem = "0";
}
}
if (rem != "0") res += rem;
reverse(res.begin(), res.end());
cout << res<}
return 0;
}

TONG001 - Tổng các số lẻ
Đề bài
Với hai số nguyên dương l và


r (1≤l≤r≤109). Tính tổng các số lẻ trong đoạn từ l đến r

Dữ liệu vào
Số lượng testcase t (t≥1t≥1). Với mỗi testcase, nhập vào 2 số theo tuần tự số
nguyên dương l và r. Hai số cách nhau bởi ít nhất một dấu cách.

Dữ liệu ra
Mỗi dòng tương ứng với một testcase ghi một giá trị của tổng các số lẻ tìm
được.

Input #1

Output #1

2
2 8
7 9

15
16

Code
#include<bits/stdc++.h>
using namespace std ;


int main(){
int t; cin >> t;
while(t--){
int l , r;

cin >> l >> r;
if(l%2==1&&r%2==1){
long long sh=((r-l)/2)+1;
long long sum=((l+r)*sh)/2;
cout <}
else if (l%2==0&&r%2==0){
l=l+1;
r=r-1;
long long sh=((r-l)/2)+1;
long long sum=((l+r)*sh)/2;
cout <}
else if (l%2==1&&r%2==0){
r=r-1;
long long sh=((r-l)/2)+1;
long long sum=((l+r)*sh)/2;
cout <}
else{
l=l+1;
long long sh=((r-l)/2)+1;
long long sum=((l+r)*sh)/2;
cout <}
}
}

TONG002 - Tổng dãy số liên tiếp
Đề bài

Với hai số nguyên dương l và r (1≤l≤r≤10^9). Tính tổng tất cả các số trong đoạn
từ l đến r.

Dữ liệu vào
Số lượng testcase t (t≥1). Với mỗi testcase, nhập vào 2 số theo tuần tự số
nguyên dương l và r. Hai số cách nhau bởi ít nhất một dấu cách.

Dữ liệu ra
Mỗi dòng tương ứng với một testcase ghi giá trị tổng tìm được.


Ví dụ
Input #1

Output #1

2
1 10
7 9

55
24

Code

#include<bits/stdc++.h>
using namespace std;
int main()
{
int Test;

cin>>Test;
while(Test--)
{
long long a, b;
cin>>a>>b;
long long x=(b-a)/1+1;
long long y=(b+a)*x/2;
cout<}
}

COBAN009 - Đếm số chữ số
Đề bài
Viết chương trình đếm số lượng chữ số của một số nguyên
(∣n∣≤101000).

n nhập từ bàn phím

Dữ liệu vào
Số lượng testcase

Dữ liệu ra

t (t≥1). Với mỗi testcase, nhập vào một số nguyên n.


Mỗi dòng tương ứng với một testcase ghi một chữ số nguyên là số chữ số đếm
được.

Ví dụ

Input #1

Output #1

2
-1
234452

1
6

Code
#include<bits/stdc++.h>
using namespace std;
int main(){
int test;
cin>>test;
while(test--){
string s;
cin>>s;
if(s[0]=='-') cout<else cout<}
}

TONG003 - Đường đi có tổng lớn nhất
Đề bài
Cho một bảng A kích thước m×n (m dịng, n cột), trên đó ghi các số nguyên aij
với 1≤m, n≤100. Một người xuất phát tại ô nào đó của cột 1, cần sang
cột n (tại ơ nào cũng được).

Quy tắc đi: Từ ô (i, j) chỉ được quyền sang một trong 3 ô (i, j+1); (i−1, j+1);
(i+1, j+1). Hãy tìm một đường đi sao cho tổng tất cả các số trên đường đi đó là
lớn nhất.

Dữ liệu vào
-Số lượng testcase t (t≥1).
-Với mỗi testcase:


Dòng đầu ghi hai số m,n là số hàng và số cột của bảng;
m dòng tiếp theo, dòng thứ i ghi n số trên hàng i của bảng theo đúng thứ tự từ
trái qua phải.

Dữ liệu ra
Mỗi dòng tương ứng với một testcase ghi tổng lớn nhất tìm được.

Ví dụ
Input #1

Output #1

2

5

2 2

41

1 3

2 2
5 7
9 -2 6 2 1 3 4
0 -1 6 7 1 3 3
8 -2 8 2 5 3 2
1 -1 6 2 1 6 1
7 -2 6 2 1 3 7

Code
#include<bits/stdc++.h>
using namespace std;
int a[102][102];
int main() {
int t;
cin >> t;
while(t--){
int m, n, res;
cin >> m >> n;
for (int i = 1; i <= m; ++i){
for (int j = 1; j <= n; ++j){
cin >> a[i][j];}
}
for (int j = 0; j <= n; ++j)
a[0][j] = a[m + 1][j] = - 101;
for (int j = 2; j <= n; ++j)


for (int i = 1; i <= m; ++i)
a[i][j] += max(a[i - 1][j - 1], max(a[i][j - 1], a[i + 1]
[j - 1]));

res = a[1][n];
for (int i = 2; i <= m; ++i)
res = max(res, a[i][n]);
cout << res << endl;
}
}

UOCSO005 - Phân tích số
Đề bài
Cho số nguyên dương n. Hãy phân tích n ra thừa số nguyên tố. Tức là tìm các
số ngun tố p1,p2,…,pk đơi một phân biệt và các số nguyên dương α1,α2,
…,αk sao cho:

n=p1a1×p2a2×...×pkak

Dữ liệu vào
Số lượng testcase

t (t≥1)

Với mỗi testcase, nhập vào một số nguyên dương

nn (1≤n≤1018).

Dữ liệu ra
Tương ứng với mỗi testcase ghi kết quả như sau:
- Dòng đầu ghi số nguyên dương

k (số các thừa số nguyên tố phân biệt).


- k dòng sau, dòng thứ i ghi hai số
số pi được sắp xếp tăng dần.

pi và αi cách nhau một dấu cách, các

Ví dụ
Input #1

Output #1

2
10
12

2
2
5
2
2
3

1
1
2
1



×