You are on page 1of 8

PHÒNG GD&ĐT LÀO CAI KHẢO SÁT LẦN 3 ĐỘI TUYỂN TIN 9

NĂM HỌC 2022-2023

Môn: TIN HỌC


ĐỀ CHÍNH THỨC Thời gian: 150 phút, không kể thời gian giao đề.
(Đề thi gồm: 03 trang)

TỔNG QUAN VỀ BÀI THI


Tên chương trình Tệp dữ liệu vào Tệp dữ liệu ra Điểm
Cau1a.* Cau1a.inp Cau1a.out 1,0
Câu 1
Cau1b.* Cau1b.inp Cau1b.out 1,5
Câu 2 Cau2.* Cau2.inp Cau2.out 2,0
Cau3a.* Cau3a.inp Cau3a.out 1,0
Câu 3
Cau3b.* Cau3b.inp Cau3b.out 1,0
Câu 4 Cau4.* Cau4.inp Cau4.out 2,0
Câu 5 Cau5.* Cau5.inp Cau5.out 1,5
Chấm bằng phần mềm chấm tự động nên thí sinh cần đặt tên tệp vào, ra,
tên chương trình đúng định dạng trên. Dấu * được thay thế bằng pas hoặc cpp
tùy theo ngôn ngữ lập trình là Pascal hoặc C++ mà thí sinh sử dụng. Mỗi test chấm
chỉ được chạy trong 1 giây, bộ nhớ sử dụng tối đa 1024MB.
Thí sinh sử dụng ngôn ngữ lập trình Pascal hoặc C++ để viết chương
trình giải các bài toán sau:

Câu 1. (2,5 điểm):


a) Tính tổng:
S=1+ 2+ 3+...+ N (Với N ≤10 9 ¿ .
Dữ liệu vào: Đọc vào từ tệp Cau1a.inp, ghi số nguyên dương N .
Kết quả ra: Ghi ra tệp Cau1a.out, là giá trị của tổng S.
Ví dụ:
Cau1a.inp Cau1a.out Giải thích
5 15 S=1+ 2+ 3+4 +5=15
Có 80% test có N ≤10 ;7

Có 20% test có 107 < N .


#include <bits/stdc++.h>
using namespace std;
int main()
{
freopen("Cau1a.inp","r",stdin);
freopen("Cau1a.out","w",stdout);
long long a;
cin>>a;
cout<<(a+1)*a/2;

Trang 1
b) Đếm số nguyên tố mà có tổng các chữ số của nó là số chẵn trong đoạn
[ A , B], với A , B là các số tự nhiên và A ≤ B .
Dữ liệu vào: Đọc vào từ tệp Cau1b.inp gồm 2 số tự nhiên A , B .
Kết quả ra: Ghi ra tệp Cau1b.out là kết quả của bài toán.
Ví dụ:
Cau1b.inp Cau1b.out Giải thích
1 17 4 Có 4 số nguyên tố mà có tổng các chữ số của nó
là chẵn trong đoạn [1,17] là: 2, 11, 13, 17
Có 70% test có A ≤ B ≤ 10 ;
5

Có 30% test có 106 ≤ A ≤ B≤ 107 .


#include <bits/stdc++.h>
using namespace std;
bool sang[10000001];
long long a,b,gioihan=1e7+1,tong=0;
bool tongso(long long so)
{
long long c=0;
while(so>0)
{
c+=so%10;
so/=10;
}
return c%2==0;

}
int main()
{
ios_base :: sync_with_stdio ( false ) ;
cin.tie ( nullptr ) ;
cout.tie ( nullptr ) ;
freopen("Cau1b.inp","r",stdin);
freopen("Cau1b.out","w",stdout);
cin>>a>>b;
for(long long i=2; i<=b; i++)
sang[i]=1;
sang[0]=0;
sang[1]=0;
for(long long i=2; i<=b; i++)
if(sang[i]==1)
for(long long j=2; j*i<=b; j++)
sang[i*j]=0;
if(a<3)
tong++;
if(a%2==0)
a++;
for(; a<=b; a+=2)

Trang 2
if(sang[a])
if(tongso(a))
tong++;
cout<<tong;

Câu 2. (2,0 điểm):


Cho một xâu không quá 106 kí tự chỉ gồm các kí tự in thường, in hoa và dấu
cách. Người ta định nghĩa một từ là các kí tự viết liên tiếp, không có dấu cách ở
giữa. Hãy viết chương trình cho biết trong xâu có bao nhiêu từ được bắt đầu bởi kí
tự ‘a’ hoặc kí tự ‘A’, nếu không có từ nào thì ghi số 0.
Dữ liệu vào: Đọc vào từ tệp Cau2.inp chứa xâu ký tự ban đầu.
Dữ liệu ra: Ghi ra tệp Cau2.out, một số là kết quả bài toán.
Ví dụ:
Cau2.inp Cau2.out Giải thích
Anh di anh nho que nha 2 Có 2 từ được bắt đầu bởi ký tự
‘a’ hoặc ký tự ‘A’
Hoc Tin rat THU vi 0 Không có từ nào được bắt đầu
bởi ký tự ‘a’ hoặc ký tự ‘A’
#include <bits/stdc++.h>
using namespace std;
string a;
long long d=0;
int main()
{
ios_base :: sync_with_stdio ( false ) ;
cin.tie ( nullptr ) ;
cout.tie ( nullptr ) ;
freopen("Cau2.inp","r",stdin);
freopen("Cau2.out","w",stdout);
getline(cin,a);
if(a[0]=='a'||a[0]=='A')
d++;
for(long long i=0; i<a.size(); i++)
if(a[i]==32&&(a[i+1]=='a'||a[i+1]=='A'))
{
d++;
}
cout<<d;

}
Câu 3. (2,0 điểm):

Trang 3
a) Đếm số cặp số anh em trong đoạn [1, N ]. Số A được gọi là anh em với số
B nếu tổng các ước của A bằng B hoặc tổng các ước của B bằng A . Cặp ( A , B) và
cặp (B , A) chỉ tính là một cặp, A khác B.
Dữ liệu vào: Đọc vào từ tệp Cau3a.inp chứa số tự nhiên N (N ≤3.10 5)
Dữ liệu ra: Ghi ra tệp Cau3a.out số cặp số anh em.
Ví dụ:
Cau3a.inp Cau3a.out Giải thích
10 5 Gồm 5 cặp (2, 3); (3, 4); (4, 7); (5, 6); (7,8)
Có 80% test có N ≤10 ;4

Có 20% test có 105 ≤ N ≤ 3.105 .


#include <bits/stdc++.h>
using namespace std;
long long mang[600007],n,d=1,tong=0;
bool sochinhphuong(long long a)
{
long long tg=sqrt(a);
if(tg*tg==a)
return 1;
else return 0;
}
long long tonguoc(long long a)
{
long long t=1+a;
for(long long i=2; i<=sqrt(a); i++)
if(a%i==0)
t=t+i+a/i;
if (sochinhphuong(a))
return t-sqrt(a);
else return t;
}
int main()
{
ios_base :: sync_with_stdio ( false ) ;
cin.tie ( nullptr ) ;
cout.tie ( nullptr ) ;
freopen("Cau3a.inp","r",stdin);
freopen("Cau3a.out","w",stdout);
cin>>n;
for(long long i=1; i<=n; i++)
mang[i]=tonguoc(i);
for(long long i=n+1; i<=n+n; i++)
mang[i]=i-n;
sort(mang+1,mang+1+2*n);
for(long long i=3; i<=n+n; i++)
{
if(mang[i]==mang[i+1])

Trang 4
d++;
else
{
tong=tong+d*(d-1)/2;
d=1;
}
}
cout<<tong;
}
b) Hằng ngày, Tí vượt qua rất nhiều ngọn đồi để đến trường. Tí đã đánh dấu
N điểm là độ cao so với mực nước biển tại các vị trí đó, các vị trí là khác nhau và
hai vị trí đánh dấu liên tiếp có độ cao khác nhau. Tí vẽ lại các vị trí đó và đố bạn
tính xem hằng ngày Tí đi học qua bao nhiêu đỉnh đồi. Đỉnh đồi là vị trí mà có độ
cao cao hơn vị trí trước và sau nó theo cách đánh dấu độ cao của Tí.
Dữ liệu vào: Đọc vào từ tệp Cau3b.inp, dòng đầu tiên ghi số N ( N ≤ 105),
dòng tiếp theo ghi N số nguyên a 1 , a2 , … a N (các giá trị 0 ≤ ai ≤105 ¿là độ cao của các
điểm Tí đã đánh dấu.
Kết quả ra: Ghi ra tệp Cau3b.out, là số đỉnh đồi trên đường Tí đi học.
Ví dụ:
Cau3b.inp Cau3b.out Giải thích
5 1 Tí chỉ đi qua một đỉnh đồi là tại vị trí 3
0 2 3 2 0 3.5
3
3
2.5
2 2 2
1.5
1
0.5
0 0 0

#include <bits/stdc++.h>
using namespace std;
long long mang[100001],n,d=0;
int main()
{
ios_base :: sync_with_stdio ( false ) ;
cin.tie ( nullptr ) ;
cout.tie ( nullptr ) ;
freopen("Cau3b.inp","r",stdin);
freopen("Cau3b.out","w",stdout);
cin>>n;
for(long long i=1; i<=n; i++)
cin>>mang[i];
for(long long i=1; i<=n; i++)
if(mang[i]>mang[i-1])
if(mang[i]>mang[i+1])
d++;
cout<<d;

Trang 5
}
Câu 4. (2,0 điểm):
Cho N đoạn dây thép, đoạn dây thứ icó độ dài Li. Cần phải cắt các đoạn đã
cho thành các đoạn nhỏ sao cho thu được ít nhất K đoạn dây thép bằng nhau có độ
dài là số nguyên dương. Có thể không cần cắt hết các đoạn dây thép đã cho. Mỗi
đoạn dây thép bị cắt có thể có phần còn thừa khác 0.
Yêu cầu: Xác định độ dài lớn nhất của các đoạn dây thép có thể nhận được.
Nếu không có cách cắt thì ghi ra số 0.
Dữ liệu vào: Đọc vào từ tệp Cau4.inp
Dòng đầu tiên chứa 2 số N , K .( 1≤ N ≤105 ; 1≤ K ≤10 9).
Dòng thứ i trong N dòng sau chứa số Li ( 1≤ Li ≤ 109 ) .
Dữ liệu ra: Ghi ra tệp Cau4.out, một số duy nhất là kết quả của bài toán.
Ví dụ:
Cau4.inp Cau4.out Giải thích
4 11 200 Đoạn thứ nhất cắt được 4 đoạn độ dài 200, đoạn
803 thứ hai cắt được 3 đoạn độ dài 200, đoạn thứ ba cắt
750 được 2 đoạn độ dài 200, đoạn thứ tư cắt được 2
455 đoạn độ dài 200.
436
Có 75% test có N <10 4 , Li ≤10 4 ;
Có 25% test có 104 < N ≤ 105 .
#include <bits/stdc++.h>
using namespace std;
long long n,mang[100001],k,tongpt=0,so,d=0;
int main()
{
freopen("Cau4.inp","r",stdin);
freopen("Cau4.out","w",stdout);
ios_base :: sync_with_stdio ( false ) ;
cin.tie ( nullptr ) ;
cout.tie ( nullptr ) ;
cin>>n>>k;
for(long long i=1; i<=n; i++)
{
cin>>mang[i];
tongpt+=mang[i];
}
sort(mang+1,mang+1+n);
tongpt=tongpt/k;
for(;tongpt>=1;tongpt--)
{
for(long long i=1;i<=n;i++)
d+=mang[i]/tongpt;
if(d>=k)
break;

Trang 6
d=0;
}
cout<<tongpt;

}
Câu 5. (1,5 điểm): Các bài toán về Số học là đam mê bất tận của Tí. Một hôm, Tí
viết ra một dãy số nguyên dương a 1 , a2 , … a N . Tí tự hỏi với dãy số trên thì Tí có thể
tìm được bao nhiêu dãy con gồm các phần tử liên tiếp của dãy ban đầu, sao cho
tổng các phần tử của dãy con này chia hết cho số K .
Dữ liệu vào: Đọc vào từ tệp Cau5.inp
Dòng đầu tiên chứa 2 số nguyên dương N , K ( N , K ≤ 105 )
Dòng thứ 2 chứa N số nguyên dương a 1 , a2 , a3 , … , aN .
Kết quả ra: Ghi ra tệp Cau5.out
Gồm một số duy nhất là số lượng dãy con liên tiếp có tổng chia hết cho K .
Ví dụ:
Cau5.inp Cau5.out Giải thích
4 3 4 Có 4 dãy con liên tiếp mà có tổng chia hết cho 3 là:
3 2 1 5 {3}; {3,2,1}; {2,1}; {1,5}
Có 40% số test có N ≤10 , ai ≤ 106
3

Có 30% số test có N ≤10 5 , ai ≤ 109


Có 30% số test có N ≤10 5 , ai ≤ 1050.
#include <bits/stdc++.h>
using namespace std;
long long n,k,mang[100001],d=0;
size_t duc;
int main()
{
// freopen("filemau.inp","r",stdin);
// freopen("filemau.out","w",stdout);
cin>>n>>k;
for(long long i=1; i<=n; i++)
{
cin>>mang[i];
mang[i]=mang[i]%k;
}
for (int i = 1; i <= n; i ++)
{
int sum = 0;
for (int j = i; j <= n; j ++)
{
sum += mang[j];
if(sum%k==0)
{
d++;
}
}

Trang 7
}
cout<<d;

}
----------Hết----------
- Thí sinh không sử dụng tài liệu
- Cán bộ coi thi không giải thích gì thêm

Trang 8

You might also like