Nguồn đề bài: http://www.spoj.com/PTIT/problems/P134SUMF/
1. Đề bài P134SUMF spoj PTIT
Tí và Tèo đang cùng nhau học về sàng nguyên tố Eratosthenes.
Thuật toán sàng nguyên tố để tìm các số nguyên tố từ 2 tới N như sau:
1. Viết tất cả các số nguyên từ 2 tới N theo đúng thứ tự.
2. Tìm số nguyên nhỏ nhất chưa bị gạch. Gọi số đó là P. P sẽ là số nguyên tố.
3. Gạch bỏ P và tất cả các bội của nó.
4. Nếu tất cả các số chưa bị gạch bỏ, quay lại bước 2.
Tí đố Tèo rằng, cho trước N và K, hãy tìm số thứ K sẽ bị gạch bỏ.
Input
Chứa 2 số nguyên N và K (2 ≤ K < N ≤ 1000).
Output
Hãy in ra số thứ K sẽ bị gạch bỏ.
Example
Test 1:
Input:
7 3
Output:
6
Test 2:
Input:
15 12
Output:
7
Test 3:
Input:
10 7
Output:
9
Giải thích test 3: Các số lần lượt bị gạch bỏ sẽ là 2, 4, 6, 8, 10, 3, 9, 5, 7.
Do đó số thứ 7 sẽ là 9.
2. Code tham khảo P134SUMF spoj PTIT
Áp dụng thuật toán sàng nguyên tố Eratosthenes bình thường, 😀 còn lại thì đếm là được.
a. Code pascal
const fi=''; nmax=1000; type data=longint; var f:text; x,M:data; A:array[1..nmax] of boolean; procedure xuli; var i,j,k:data; begin for i:=1 to x do a[i]:=false; i:=2; k:=0; while i<=x do begin if not a[i] then begin for j:=1 to x div i do if not a[i*j] then begin inc(k); if k=m then begin writeln(i*j); exit; end; a[i*j]:=true; end; end; inc(i); end; end; begin assign(f,fi); reset(f); while not eof(f) do begin readln(f,x,m); xuli; end; end.
b. Code c++
#include<stdio.h> #include <cmath> #include <iostream> using namespace std; int main() { int i,j,*a,k,count=0,n; cin >> n >> k; a=new int[n+1]; for(i=2;i<=n;i++) a[i]=1; for(i=2;i<=n/2;i++) for(j=1;j<=n/i;j++) { if(a[i*j]==1) //nếu là số chưa xử lý thì xóa đến hết n số { a[i*j]=0; count++; if(count==k) cout << i*j; } } }
Sao i không chạy đến sqrt(x) vậy ad.em vẫn chưa hiểu