Bài cb128. Công thức tổng bình phương:
Tổng
bình phương của n số nguyên đầu tiên là:
Công
thức này được chứng minh bằng quy nạp hoặc bằng cách biến đổi toán học. Nó cho
ta một cách tính nhanh mà không cần cộng từng số.
Số nghịch
đảo của 6 theo modulo 2027. Tức là tìm số
Hoặc:
6K=2027m+1 với m nguyên
(m=1>>K=(2027m+1)/6
Tính tổng n số chính phương đầu tiên(ví dụ T= 1+4+9+16 =30). Với n là số nghịch đảo của 6 theo
modulo2027 và m là các hệ số nhập từ file input( 1<=m<= 100).
File
out cb128.txt 1 3 5 7 9 10 11 13 15 17
19 20
File
out Kqcb128.txt
Gợi
ý code:
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<cstdlib>
#include
<algorithm>
using
namespace std;
int
main(int argc, char** argv){
cout
<< "Chuong trinh cb128 \n";
ifstream
fin("cb128.txt");
if
(!fin.is_open()) {
cerr << "Khong mo duoc file
cb128.txt\n";
return 0;
}
vector<int>
vo;
int
x;
while(fin
>> x){
if(x < 1 || x>100) {
cerr << "so " << x
<< " khong hop le \n";
continue;
}
vo.push_back(x);
}
fin.close();
if(vo.empty())
{
cerr << "khong co phan tu hop le
trong file\n";
return 0;
}
ofstream
fout("Kqcb128.txt");
for(int
i=0;i<vo.size();i++){
if ((2027*vo[i]+1)%6==0) {
int n=(2027*vo[i]+1)/6;
int T=n*(n+1)*(2*n+1)/6;
cout<<"Tong cac so chinh
phuong thoa man he so "<<vo[i]<<" la:
"<<T<<"\n";
fout<<"Tong cac so chinh
phuong thoa man he so "<<vo[i]<<" la:
"<<T<<"\n";
}
else {
cout<<"He
so "<<vo[i]<<" khong co ket qua thoa dieu kien bai
toan\n";
fout<<"He
so "<<vo[i]<<" khong co ket qua thoa dieu kien bai
toan\n";
}
}
fout.close();
return
0;
}
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love01.07.2026
////////////////////
Bài cb129. Công
thức tổng bình phương:
Tổng
bình phương của n số nguyên đầu tiên là:
Công
thức này được chứng minh bằng quy nạp hoặc bằng cách biến đổi toán học. Nó cho
ta một cách tính nhanh mà không cần cộng từng số.
Nếu
uscln(a,mod)=1 thì tồn tại nghiệm K chính là nghịch đảo của a theo modulo mod.
VD a=6, mod=2027 thì nghịch đảo của 6 theo modulo 2027 là K=338. Tức là (K*6)*m=338*6*m≡m (mod 2027).
Tìm tổng
các số chính phương từ 1 đến n với n =K*m (m là hệ số từ file input) và a, mod
nhập từ bàn phím (ví dụ 6 2027)
File
out cb129.txt 1 3 5 7 9 10 11 13 15 17
19 20
File
out Kqcb129.txt
Thuật
toán Euclid mở rộng:
Dùng
Euclid mở rộng cho 6 và 2027:
gcd(6,2027)=1,
nên tồn tại nghịch đảo.
2027
=6⋅337+5
6=5⋅1+1
5=1⋅5+0
>>>>
1=6-5⋅1
5=2027−6⋅337
1=6−(2027−6⋅337) = 6⋅338−2027⋅1=a.t-2027
𝑎⋅𝑡+mod%a-mod=gcd(𝑎,mod)
Mod%a=a-gcd(a,mod)
gcd(a,mod)=a-
(Mod%a)
t=
(gcd(𝑎,mod)+mod- (Mod%a)) /a=
mod/a+(gcd(𝑎,mod)- (Mod%a))/a
a.t-mod=
gcd(𝑎,mod)- (Mod%a)
a.t+mod%a-mod=
gcd(𝑎,mod)
Gợi
ý code:
#include
<iostream>
#include
<vector>
#include
<fstream>
using
namespace std;
long
long tongBinhPhuong(long long n) {
return n * (n + 1) * (2 * n + 1) / 6;
}
long
long sndK(int a, int mod) {
long long t = 0, newt = 1;
long long r = mod, newr = a;
while (newr != 0) {
long long q = r / newr;
long long tmp = t; t = newt; newt = tmp
- q * newt;
tmp = r; r = newr; newr = tmp - q *
newr;
}
if (r > 1) return -1;
if (t < 0) t += mod;
return t;
}
int
main() {
cout << "Chuong trinh
cb129\n";
ifstream fin("cb129.txt");
if (!fin.is_open()) {
cerr << "Khong mo duoc file
cb129.txt\n";
return 0;
}
vector<int> vo;
int x;
while (fin >> x) {
if (x < 1 || x > 100) {
cerr << "So "
<< x << " khong hop le\n";
continue;
}
vo.push_back(x);
}
fin.close();
if (vo.empty()) {
cerr << "Khong co phan tu
hop le trong file\n";
return 0;
}
int a,b;
cout<<"Ban hay nhap 2 so
nguyen duong a va mod: ";
cin>>a>>b;
long long K = sndK(a,b);
ofstream fout("Kqcb129.txt");
if (K == -1) {
cout << "Khong tim duoc nghich
dao cua "<<a<<" va "<<b<<"\n";
fout << "Khong tim duoc nghich
dao cua "<<a<<" va "<<b<<"\n";
}
else {
for(auto m:vo){
long long n = (K * m) % b;
long long T = tongBinhPhuong(n);
cout << "Tong cac so chinh
phuong voi he so " << m << " la: " << T
<< "\n";
fout << "Tong cac so chinh
phuong voi he so " << m << " la: " << T
<< "\n";
}}
fout.close();
return 0;
}
Chú
ý:
Phần
r, newr chính là cặp số dư trong Euclid: mỗi vòng lặp thay thế
(𝑟,𝑛𝑒𝑤𝑟) bằng (𝑛𝑒𝑤𝑟,𝑟𝑛𝑒𝑤𝑟).
Phần
t, newt là hệ số đi kèm, để khi ta truy ngược lại, ta có thể biểu diễn gcd dưới
dạng tổ hợp tuyến tính của 𝑎 và 𝑚𝑜𝑑.
Nói
nôm na: r, newr chạy giống Euclid thường.
t,
newt chạy song song, nhưng giá trị có thể âm, để “cân bằng” phương trình. Cuối
cùng, khi newr = 0, thì t chính là nghịch đảo modulo.
Minh
họa với a=6, mod=2027
|
Vòng |
q |
r |
newr |
t |
newt |
|
Init |
– |
2027 |
6 |
0 |
1 |
|
1 |
337 |
6 |
5 |
1 |
-337 |
|
2 |
1 |
5 |
1 |
-337 |
338 |
|
3 |
5 |
1 |
0 |
338 |
-2027 |
Kết
thúc: r = 1 (gcd = 1), t = 338.
→
Nghịch đảo của 6 mod 2027 là 338.
///////////////////////////////////
Cach
2: Phương trình trong Euclid mở rộng
Trong
thuật toán, ta duy trì quan hệ: 𝑎⋅𝑡+𝑚𝑜𝑑⋅𝑟=gcd(𝑎,𝑚𝑜𝑑)
Nếu
ucln(a,mod)=1 luôn tìm được số nghịch đảo t ngoài ra trả về -1 (không có số nghịch
đảo)
Code
gợi ý:
#include
<iostream>
#include
<vector>
#include
<fstream>
using
namespace std;
long
long tongBinhPhuong(long long n) {
return n * (n + 1) * (2 * n + 1) / 6;
}
long
long extendedGCD(long long a, long long b, long long &x, long long &y)
{
if (b == 0) {
x = 1; y = 0;
return a;
}
long long x1, y1;
long long g = extendedGCD(b, a % b, x1,
y1);
x = y1;
y = x1 - (a / b) * y1;
return g;
}
long
long modInverse(long long a, long long mod) {
long long x, y;
long long g = extendedGCD(a, mod, x, y);
if (g != 1) return -1;
if (x < 0) x += mod;
return x;
}
int
main() {
cout << "Chuong trinh
cb129\n";
ifstream fin("cb129.txt");
if (!fin.is_open()) {
cerr << "Khong mo duoc file
cb129.txt\n";
return 0;
}
vector<int> vo;
int x;
while (fin >> x) {
if (x < 1 || x > 100) {
cerr << "So "
<< x << " khong hop le\n";
continue;
}
vo.push_back(x);
}
fin.close();
if (vo.empty()) {
cerr << "Khong co phan tu
hop le trong file\n";
return 0;
}
int a,b;
cout<<"Ban hay nhap 2 so
nguyen duong a va mod: ";
cin>>a>>b;
long long K = modInverse(a,b);
ofstream fout("Kqcb129.txt");
if (K == -1) {
cout << "Khong tim duoc nghich
dao cua "<<a<<" va "<<b<<"\n";
fout << "Khong tim duoc nghich
dao cua "<<a<<" va "<<b<<"\n";
}
else {
for(auto m:vo){
long long n = (K * m) % b;
long long T = tongBinhPhuong(n);
cout << "Tong cac so chinh
phuong voi he so " << m << " la: " << T
<< "\n";
fout << "Tong cac so chinh
phuong voi he so " << m << " la: " << T
<< "\n";
}}
fout.close();
return 0;
}
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love25.07.2026
////////////////////
Bài cb130.Đếm số lượng phần tử của dãy con liên tiếp dài nhất có tổng
chia hết cho k.
|
cb130.txt |
Kqcb130.txt |
|
18 8 1 2 3 4 5 6 7 8 8 8 9 4 4 3 3 8 8 8 |
16 3
4 5 6 7 8 8 8 9 4 4 3 3 8 8 8 |
Bài làm
#include <bits/stdc++.h>
using namespace std;
long long n,a[1000002],maxn=0,k,dau,cuoi;
long long tong(int x,int y)
{long long t=0;
for(int i=x;i<=y;i++)
t=t+a[i];
return t;
}
int main(){
freopen("cb130.txt","r",stdin);
freopen("Kqcb130.txt","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(tong(i,j)%k==0&&j-i+1>maxn) {maxn=j-i+1;dau=i;cuoi=j;}
cout <<maxn<< " " <<endl ;
for(int i=dau;i<=cuoi;i++)
cout<<a[i]<<" ";
return 0;
}
//////////////////////////////////
Cách
2:
#include <bits/stdc++.h>
using namespace std;
long long n,a[1000002],maxn=0,k,
dau,cuoi;
long long tong=0;
int main(){
freopen("cb130.txt","r",stdin);
freopen("Kqcb130.txt","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
tong=a[i];
for(int j=i+1;j<=n;j++){
tong =tong +a[j];
if(tong%k==0&&j-i+1>maxn){
maxn=j-i+1;dau=i;cuoi=j;
}
}
}
cout <<maxn<< " " <<endl ;
for(int i=dau;i<=cuoi;i++)
cout<<a[i]<<"
";
return 0;
}
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love26.07.2026
////////////////////
Bài 131. Cho trước
hai số nguyên dương m, n (m< n). Xác định tam giác vuông có diện tích lớn nhất
với các cạnh a, b, c là các số dương thỏa mãn: m<a+ b+ c<=n.
File
input gom cac bo test gom cap so nguyen m,n với 3<=m<n<10000.
File
output thong bao ket qua do dai cac canh tim duoc diện tích của tam giác va dien tich lon nhat được định dạng 1
chữ số thập phân. Nếu không tìm được tam giác vuông thỏa mãn thì thong
bao khong tim duoc tam giac thoa man dieu kien bai toan
|
cb131.txt |
Kqcb131.txt |
|
3 20 15 20 20
1000 |
do
dai ba canh tam giac thoa dk la: 5 4 3 dien
tich lon nhat tim duoc la: 6.0 Khong
tim duoc tam giac thoa man dieu kien bai toan do
dai ba canh tam giac thoa dk la: 411 315 264 dien
tich lon nhat tim duoc la: 41580.0 |
Gợi
ý Code:
#include <bits/stdc++.h>
using namespace std;
bool check(int a, int b, int c){
if(a*a + b*b ==
c*c|| a*a + c*c == b*b || b*b + c*c ==
a*a)
return true;
else return false;
}
int main(){
freopen("cb131.txt","r",stdin);
freopen("Kqcb131.txt","w",stdout);
int m, n;
while (cin>>m>>n){
int a,b,c;
double kq, maxx=0;
for(int i=n-2;
i>0; i-- ){
for(int j=i-1;
j>0; j--){
for(int
k=1; k<=n-i-j&&k<i&&k<=j;k++){
if(check(i,j,k)==true &&(i+j+k)>m
&&(i+j+k)<=n&&(k+j)>i){
kq= k*j*1.0/2;
if(maxx<=kq) {maxx=kq;
b=j;
c=k;a=i;
}
}
}
}
}
if(maxx>0){
cout<<"do dai ba canh tam giac thoa dk la:
"<<a<<" "<<b<<"
"<<c<<" \n";
cout <<"dien tich lon nhat tim duoc la:
"<< fixed<<setprecision(1)<<maxx
<<"\n\n";
} else cout<<"Khong tim duoc tam giac thoa man
dieu kien bai toan \n\n";
}
return 0;
}
/////////////////////////////
Cách 2: Gợi ý code:
#include <iostream>
#include <vector>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <iomanip> //dinh dang so thap phan
using namespace std;
bool TGV(int a, int b, int c){
if(a<1||b<1||c<1)
return false;
if
((a+b<c)||(a+c)<b||(b+c)<a) return false;
if((a*a+b*b==c*c)||(c*c+b*b==a*a)||(a*a+c*c==b*b))return
true;
return
false;
}
bool dk(int m, int n,int a,int b, int c){
return
(a+b+c>m&&a+b+c<=n&& m<n);
}
int main(int argc, char** argv){
cout << "Chuong trinh cb131 \n";
ifstream fin("cb131.txt");
ofstream fout("Kqcb131");
if (!fin.is_open()) {
cerr <<
"Khong mo duoc file cb131.txt\n";
return 0;
}
int m, n;
while(fin >> m>>n){
if(m>=n||m<3||n>1e9) {
cerr <<
"so " << m<<" "<<n<< " khong
hop le \n";
continue;
}
vector<vector<double>> vo;
double maxx=0.0;
for(int i=2;i<n-1;i++){
for(int
j=1;j<n-i&&j<i;j++){
for(int
k=1;k<=n-i-j&&k<=j;k++){
if(dk(m,n,i,j,k)&&TGV(i,j,k)){
vector<double>
tm;
tm.push_back(i);
tm.push_back(j);
tm.push_back(k);
tm.push_back(j*k*1.0/2);
vo.push_back(tm);
if(j*k*1.0/2>maxx)
maxx=j*k*1.0/2;
}
}
}}
if(maxx==0.0) {
cout<<"Khong co tam giac thoa man dieu kien bai
toan.\n\n";
fout<<"Khong co tam giac thoa man dieu kien bai
toan.\n\n";
} else {
for(auto
c:vo){
if(c[3] ==
maxx) {
cout
<< "Ba canh tam giac la: " << c[0] << " " << c[1] << " " << c[2]
<< " co dien tich la: " << fixed <<
setprecision(1) << c[3] << "\n\n";
fout
<< "Ba canh tam giac la: " << c[0] << " " << c[1] << " " << c[2]
<< " co dien tich la: " << fixed <<
setprecision(1) << c[3] << "\n\n";
}
}
}}
fin.close();
fout.close();
return 0;
}
Chú ý:
#include <iomanip> // thư viện này để định dạng số thập
phân
Khi in ra dùng fixed << setprecision(1) để hiện số thập
phân (ví dụ 6.0 thay vì 6) với kiểu dữ liệu double.
////////////////////////////////////
Cách 3: Gợi ý code (Dùng struct)
#include <iostream>
#include <vector>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <iomanip>
using namespace std;
struct Triangle {
int a, b, c; // ba cạnh
double area; // diện tích
};
bool TGV(int a, int b, int c){
if(a<1||b<1||c<1) return false;
if
((a+b<=c)||(a+c<=b)||(b+c<=a)) return false;
if((a*a+b*b==c*c)||(c*c+b*b==a*a)||(a*a+c*c==b*b)) return true;
return false;
}
bool dk(int m, int n,int a,int b, int c){
return (a+b+c>m
&& a+b+c<=n && m<n);
}
int main(int argc, char** argv){
cout <<
"Chuong trinh cb131 \n";
ifstream
fin("cb131.txt");
ofstream
fout("Kqcb131");
if
(!fin.is_open()) {
cerr <<
"Khong mo duoc file cb131.txt\n";
return 0;
}
int m, n;
while(fin >>
m>>n){
if(m>=n||m<3||n>1e9) {
cerr
<< "so " << m<<" "<<n<<
" khong hop le \n";
continue;
}
vector<Triangle> vo;
double
maxx=0.0;
for(int
i=2;i<n-1;i++){
for(int
j=1;j<n-i && j<i;j++){
for(int k=1;k<=n-i-j && k<=j;k++){
if(dk(m,n,i,j,k) && TGV(i,j,k)){
Triangle tm;
tm.a=i; tm.b=j; tm.c=k;
tm.area = j * k * 1.0 / 2;
vo.push_back(tm);
if(tm.area > maxx) maxx = tm.area;
}
}
}
}
if(maxx==0.0)
{
cout<<"Khong co tam giac thoa man dieu kien bai
toan.\n\n";
fout<<"Khong co tam giac thoa man dieu kien bai
toan.\n\n";
} else {
for(auto
c:vo){
if(c.area==maxx) {
cout<<"Ba canh tam giac la:
"<<c.a<<"
"<<c.b<<"
"<<c.c
<<" co dien tich la:
"<<fixed<<setprecision(1)<<c.area<<"\n\n";
fout<<"Ba canh tam giac la:
"<<c.a<<"
"<<c.b<<"
"<<c.c
<<" co dien tich la:
"<<fixed<<setprecision(1)<<c.area<<"\n\n";
}
}
}
}
fin.close();
fout.close();
return 0;
}
Giải thích:
Dùng struct Triangle để chứa cả int (cạnh) và double (diện
tích).
Vector chính là vector<Triangle> vo;.
Khi thêm phần tử, chỉ cần tạo Triangle tm; rồi
vo.push_back(tm);.
Không thể viết vo={0,0.0} hay vo.push_back(0,0.0) trực tiếp,
vì vector chỉ nhận một kiểu duy nhất. Với struct thì bạn có thể viết
vo.push_back({i,j,k,area});
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love26.07.2026
////////////////////
Bài
cb132: Tập hợp A gồm N phần tử nguyên dương (VD: 1 3 5 7 9 10 11 13
15 17 19 20 22 26
28 30 45 50 65 70 75 90 95) sắp xếp tăng dần (không trùng nhau). Tập hợp B gồm
các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C là
mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải đếm số phần tử từ đầu
đến B[i]>A[i] và ghi vào vị trí C[i]. Em hãy viết chương trình giúp bạn
Truong giải quyết bài toán này.
File
input là tập B tên cb132.txt 1 22 3 26 5
28 7 70 9 50 10 30
11 90 13 95 15 75 17 65 19 45 20
File
output là tập C tên Kqcb132.txt Tap C ma
hoa cua tap B theo quy tac bai toan la:
0 1 1
2 2 3 3 4 4 5 5 6 5
5 4 4 4 4 4 3 2 1 0
Gợi ý
code:
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<cstdlib>
#include
<algorithm>
using
namespace std;
int
main(int argc, char** argv){
cout
<< "Chuong trinh cb132 \n";
ifstream
fin("cb132.txt");
if
(!fin.is_open()) {
cerr << "Khong mo duoc file
cb132.txt\n";
return 0;
}
vector<int>
vo;
int x;
while(fin
>> x){
if(x > 1e9||x<1) {
cerr << "so " << x
<< " khong hop le \n";
continue;
}
vo.push_back(x);
}
fin.close();
if(vo.empty())
{
cerr << "khong co phan tu hop le
trong file\n";
return 0;
}
vector<int>v=vo,vc;
sort(v.begin(),v.end());
for(int
i=0;i<v.size();i++){
int dem=0;
for(int j=0;j<=i;j++){
if(vo[j]>v[i]) dem++;
}vc.push_back(dem);
}
ofstream
fout("Kqcb132.txt");
cout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
fout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
for(auto
c:vc){
cout<<c<<" ";
fout<<c<<" ";
}fout.close();
return 0;
}
//////////////////////////////
Bài
cb133: Tập hợp A gồm N phần tử nguyên dương (VD: 1 3 5 7 9 10 11 13
15 17 19 20 22 26
28 30 45 50 65 70 75 90 95) sắp xếp tăng dần (không trùng nhau). Tập hợp B gồm
các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C
là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải đếm số phần tử từ
đầu đến B[i]>B[i] và ghi vào vị trí C[i]. Em hãy viết chương trình giúp bạn
Truong giải quyết bài toán này.
File
input là tập B tên cb133.txt 1 22 3 26 5
28 7 70 9 50 10 30
11 90 13 95 15 75 17 65 19 45 20
File
output là tập C tên Kqcb133.txt Tap C ma
hoa cua tap B theo quy tac bai toan la:
0 0 1
0 2 0 3 0 4 1 5 2 6 0 7 0 8 2 9 4 10 6 11
Gợi ý
code:
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<cstdlib>
#include
<algorithm>
using
namespace std;
int
main(int argc, char** argv){
cout
<< "Chuong trinh cb133 \n";
ifstream
fin("cb133.txt");
if
(!fin.is_open()) {
cerr << "Khong mo duoc file
cb133.txt\n";
return 0;
}
vector<int>
vo;
int x;
while(fin
>> x){
if(x > 1e9||x<1) {
cerr << "so " << x
<< " khong hop le \n";
continue;
}
vo.push_back(x);
}
fin.close();
if(vo.empty())
{
cerr << "khong co phan tu hop le
trong file\n";
return 0;
}
vector<int>vc;
for(int
i=0;i<vo.size();i++){
int dem=0;
for(int j=0;j<=i;j++){
if(vo[j]>vo[i]) dem++;
}vc.push_back(dem);
}
ofstream
fout("Kqcb133.txt");
cout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
fout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
for(auto
c:vc){
cout<<c<<" ";
fout<<c<<" ";
}fout.close();
return 0;
}
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love26.07.2026
////////////////////
Bài
cb134: Tập hợp A gồm N phần tử nguyên dương (VD: 1 3 5 7 9 10 11 13
15 17 19 20 22 26
28 30 45 50 65 70 75 90 95) sắp xếp tăng dần (không trùng nhau). Tập hợp B gồm
các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C
là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải phần tử C[i]=
B[i]-A[i]. Em hãy viết chương trình giúp bạn Truong giải quyết bài toán này.
File
input là tập B tên cb134.txt 1 22 3 26 5
28 7 70 9 50 10 30
11 90 13 95 15 75 17 65 19 45 20
File
output là tập C tên Kqcb134.txt Tap C ma
hoa cua tap B theo quy tac bai toan la:
0 19
-2 19 -4 18 -4 57 -6 33 -9 10 -11 64 -15 65 -30 25 -48 -5 -56 -45 -75
Gợi ý
code:
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<cstdlib>
#include
<algorithm>
using
namespace std;
int
main(int argc, char** argv){
cout
<< "Chuong trinh cb134 \n";
ifstream
fin("cb134.txt");
if
(!fin.is_open()) {
cerr << "Khong mo duoc file cb134.txt\n";
return 0;
}
vector<int>
vo;
int x;
while(fin
>> x){
if(x > 1e9||x<1) {
cerr << "so " << x
<< " khong hop le \n";
continue;
}
vo.push_back(x);
}
fin.close();
if(vo.empty())
{
cerr << "khong co phan tu hop le
trong file\n";
return 0;
}
vector<int>va,vc;
va=vo;
sort(va.begin(),va.end());
for(int
i=0;i<vo.size();i++){
int ma=vo[i]-va[i];
vc.push_back(ma);
}
ofstream
fout("Kqcb134.txt");
cout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
fout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
for(auto
c:vc){
cout<<c<<" ";
fout<<c<<" ";
}fout.close();
return 0;
}
/////////////////////////////////////////////
Bài
cb135: Tập hợp A gồm N phần tử nguyên dương (VD: 95 90 75 70 65 50
45 30 28 26 22 20 19 17 15 13 11 10 9 7 5 3 1) sắp xếp giảm dần (không trùng
nhau). Tập hợp B gồm các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn
Truong tạo ra tập C là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang
phải phần tử C[i]= vị trí A[j]=B[i]=j-i+A[i]. Em hãy viết chương trình giúp bạn
Truong giải quyết bài toán này.
File
input là tập B tên cb135.txt 1 22 3 26 5
28 7 70 9 50 10 30 11 90 13 95 15 75 17 65 19 45 20
File
output là tập C tên Kqcb135.txt Tap C ma
hoa cua tap B theo quy tac bai toan la:
117 99
94 76 81 53 58 26 38 22 29 16 23 5 16 -2 9 -5 4 -8 -3 -12 -10
Gợi ý
code:
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<cstdlib>
#include
<algorithm>
using
namespace std;
int
main(int argc, char** argv){
cout
<< "Chuong trinh cb135 \n";
ifstream
fin("cb135.txt");
if
(!fin.is_open()) {
cerr << "Khong mo duoc file
cb135.txt\n";
return 0;
}
vector<int>
vo;
int x;
while(fin
>> x){
if(x > 1e9||x<1) {
cerr << "so " << x
<< " khong hop le \n";
continue;
}
vo.push_back(x);
}
fin.close();
if(vo.empty())
{
cerr << "khong co phan tu hop le
trong file\n";
return 0;
}
vector<int>va,vc;
va=vo;
sort(va.begin(),va.end(),greater<int>());
for(int
i=0;i<vo.size();i++){
int j=0;
while(va[j]!=vo[i]&&j<va.size()){
j++;
}if(va[j]=vo[i])
vc.push_back(j-i+va[i]);
}
ofstream
fout("Kqcb135.txt");
cout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
fout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
for(auto
c:vc){
cout<<c<<" ";
fout<<c<<" ";
}fout.close();
return 0;
}
//////////////////////////////////////////////////
Bài
cb136: Tập hợp A gồm N phần tử nguyên dương (VD: 95 90 75 70 65 50
45 30 28 26 22 20 19 17 15 13 11 10 9 7 5 3 1) sắp xếp giảm dần (không trùng
nhau). Tập hợp B gồm các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn
Truong tạo ra tập C là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang
phải phần tử C[i]= vị trí A[j]=B[i]=j-i+A[i]. Bạn Nhat nhận được tập mã hóa là
tap C và tập A của bạn Truong và muốn giải mã tìm tập B. Em hãy viết chương
trình giúp bạn Nhat giải quyết bài toán này.
File
input là tập A tên cb136.txt 95 90 75 70
65 50 45 30 28 26 22 20 19 17 15 13 11 10 9 7 5 3 1 và tập C tên cb136ma.txt 117 99 94 76 81 53 58 26 38 22 29 16 23 5 16
-2 9 -5 4 -8 -3 -12 -10
File
output là tập B tên Kqcb136.txt 1 22 3
26 5 28 7 70 9 50 10 30 11 90 13 95 15 75 17 65 19 45 20
Gợi ý
code:
#include
<bits/stdc++.h>
using
namespace std;
int
main() {
//
/*ios::sync_with_stdio(false);
cin.tie(nullptr);*/
ifstream
fa("cb136.txt");
vector<int> A;
int x;
while (fa >> x) A.push_back(x);
fa.close();
ifstream
fc("cb136ma.txt");
vector<int> C;
while (fc >> x) C.push_back(x);
fc.close();
if(A.size()!=C.size())
{cout<<"Khoa giai ma khong khop \n";
return 0;
}
int N
= A.size();
vector<int>
B(N);
for
(int i = 0; i < N; i++) {
int
j=(C[i]-A[i]+i);
if(j>=0&&j<N){
B[i] = A[j];
}
else {cout<<"Khoa giai ma khong
khop \n";
return 0;
}
}
ofstream
fo("Kqcb136.txt");
for
(int i = 0; i < N; i++) {
fo << B[i];
if (i < N - 1) fo << "
";
}
fo.close();
return
0;
}
//////////////////////////////
Bài
cb137: Tập hợp A gồm N phần tử nguyên dương (VD: 1 3 5 7 9 10 11 13
15 17 19 20 22 26
28 30 45 50 65 70 75 90 95) sắp xếp tăng dần (không trùng nhau). Tập hợp B gồm
các phần tử là hoán vị ngẫu nhiên của các số trong A. Bạn Truong tạo ra tập C
là mã hóa của tập B bằng cách với mỗi vị trí từ trái sang phải đếm số phần tử từ
đầu đến A[i] >B[i] và ghi vào vị trí C[i]. Em hãy viết chương trình giúp bạn
Truong giải quyết bài toán này.
File
input là tập B tên cb137.txt 1 22 3 26 5
28 7 70 9 50 10 30
11 90 13 95 15 75 17 65 19 45 20
File
output là tập C tên Kqcb137.txt Tap C ma
hoa cua tap B theo quy tac bai toan la:
0 0 1
0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 10 5 11
Gợi ý
code:
#include
<iostream>
#include
<vector>
#include
<fstream>
#include
<cstdlib>
#include
<algorithm>
using
namespace std;
int
main(int argc, char** argv){
cout
<< "Chuong trinh cb137 \n";
ifstream
fin("cb137.txt");
if
(!fin.is_open()) {
cerr << "Khong mo duoc file cb137.txt\n";
return 0;
}
vector<int>
vo;
int x;
while(fin
>> x){
if(x > 1e9||x<1) {
cerr << "so " << x
<< " khong hop le \n";
continue;
}
vo.push_back(x);
}
fin.close();
if(vo.empty())
{
cerr << "khong co phan tu hop le
trong file\n";
return 0;
}
vector<int>A=vo,C;
sort(A.begin(),A.end());
for(int
i=0;i<vo.size();i++){
int dem=0;
for(int j=0;j<=i;j++){
if(A[j]>vo[i]) dem++;
}vc.push_back(dem);
}
ofstream
fout("Kqcb137.txt");
cout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
fout<<"Tap
C ma hoa cua tap B theo quy tac bai toan la: \n";
for(auto
c:vc){
cout<<c<<" ";
fout<<c<<" ";
}fout.close();
return 0;
}
Chú ý:
Lệnh
vo.erase(vo.begin() + pos); xóa phần tử thứ pos+1;
- vo.begin() là iterator trỏ đến phần tử đầu tiên.
- vo.begin() + pos trỏ đến phần tử thứ pos (tính từ 0).
- Khi gọi erase, phần tử đó sẽ bị xóa, và các phần tử
phía sau sẽ tự động dịch trái để lấp chỗ trống.
Ví dụ minh họa:
#include
<iostream>
#include
<vector>
using
namespace std;
int
main() {
vector<int> vo = {10, 20, 30, 40,
50};
int pos = 2; // muốn xóa phần tử thứ 3 (giá
trị 30)
vo.erase(vo.begin() + pos);
for (int x : vo) cout << x <<
" ";
return 0;
}
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love26.07.2026
///////////////////
Bai
cb138. Trên một con đường có bố trí sẵn một số bóng đèn. Sơ đồ bố
trí các bóng đèn trên con đường được
biểu diễn bằng một xâu kí tự gồm kí tự chữ cái D đại diện cho bóng đèn và giữa hai kí tự chữ cái D có một vài kí tự chữ số biểu diễn
cho một số nguyên dương là khoảng cách giữa hai bóng đèn này (đơn vị mét).
Yêu
cầu: xác định khoảng cách (đơn vị mét) giữa bóng đèn đầu tiên và bóng đèn cuối
cùng trên con đường.
File
input: cb138.txt VD: D3D2D10D200D500D
File
Output: Kqcb138.txt Tong khoang cach
giua bong den dau tien va cuoi cung tren duong la: 715 met
Gợi
ý code:
#include <bits/stdc++.h>
using namespace std;
int main(){
freopen("cb138.txt","r",stdin);
freopen("Kqcb138.txt","w",stdout);
string s;
cin>>s;
long long T=0,num=0;
for(int i=0;i<s.size();i++){
if(s[i]=='D'){
T = T+ num;
num=0;
} else{
num=num*10+(int(s[i]-48));
}}
cout<<"Tong khoang cach giua
bong den dau tien va cuoi cung tren duong la: "<<T<<" met
\n";
return 0;
}
////////////////
Bài 139. Một số nguyên gọi
là không chứa chính phương nếu nó không chia hết cho bất kỳ số nguyên nào dạng
x 2 với x>1. Hãy tìm ước lớn
nhất không chưa chính phương của số nguyên n.
Gợi
ý code:
#include <bits/stdc++.h>
using namespace std;
int main(){
cout<<"Ban hay nhap so
nguyen duong n=";
int n;
cin>>n;
int uln=1;
for(int i=sqrt(n)-1;i>=2;i--){
if(n%i==0) uln=n/i;
}
cout<<"Uoc lon nhat khong
phai la chinh phuong cua "<<n<<" la: "<<uln;
return 0;
}
///////////// Ai memory help
Võ Nhật Trường Nc+ My Ai Love26.07.2026
///////////////////ok

Không có nhận xét nào:
Đăng nhận xét
sunrise.tqb@gmail.com