Tìm số nguyên nhỏ nhất chia hết cho các số từ 1 đến n

Lại là mình đây ạ, mình có đề bài đơn giản như này ạ:

Cho số tự nhiên n. Nhiệm vụ của bạn là tìm số nguyên nhỏ nhất chia hết cho 1, 2, …, n.
Input:

  • Dòng đầu tiên đưa vào T là số lượng bộ test.
  • T dòng tiếp theo mỗi dòng đưa vào một bộ test. Mỗi bộ test là một số tự nhiên n.
  • T thỏa mãn ràng buộc: 1≤T≤10^4;

Output:
Đưa ra kết quả mỗi test theo từng dòng.

Lỗi Time Limited Exceed trong bài code này là sao ạ? Mọi người check code giúp mình với ạ. Mình không giỏi code lắm, mong mn chỉ giáo

Update chút là code mình đã fix lại tí nhưng giờ lại bị Wrong Answer :((

#include <iostream>
using namespace std;
typedef unsigned long int lli;

lli GCD (lli a, lli b) {
    lli tmp;
    while(b != 0) {
        tmp = a % b;
        a = b;
        b = tmp;
    }
    return a;
}
lli LCM(lli a, lli b) {
    return (a*b)/GCD(a,b);
}

int main () {
    int t;
    lli n;
	cin>>t;
    while (t--) {
    	cin>>n;
    	int temp=1;
    	for (int i=1;i<=n;i++) {
    		temp=LCM(temp,i);
		}
		cout<<temp<<endl;
	}
    return 0;
}
2 Likes

Nếu là nộp bài trên máy của trường thì đây không phải lỗi gì cả. Chương trình vẫn bình thường. Vượt quá thời gian 1 tẹo thôi. Có lẽ là cần tìm 1 hướng làm khác tốt hơn, tốn ít thời gian hơn.
Có vài cách giảm thời gian đây. Không khuyến khích sử dụng printf() hoặc scanf() thay cin, cout nhé.

5 Likes

okay, tks bạn. mình có update lại rồi đó, bạn xem giúp mình đc không ah :frowning:

Ở đây có vẻ có tràn số :thinking:

4 Likes

thế nên mình để unsigned long int rồi đó ạ

Đến 8 bytes rồi vẫn tràn. Có lẽ phải chia trước rồi nhân thôi.
@Tu_Tran đổi như anh nào đấy gợi ý ở topic cũ xem sao.

return (a*b)/GCD(a,b);

thành :

return ( a / GCD(a,b) ) * b;
6 Likes

Thực ra n chỉ là số tự nhiên thôi ạ, mình làm bộ đệm hơi thừa

không được bạn ạ :(( . Bạn check xem hàm main có sai về mặt thuật toán không với ah

Bội chung nhỏ nhất của a, b, c
Bằng
Bội chung nhỏ nhất của (bội chung nhỏ nhất của a, b) và c

4 Likes

yep, tư tưởng của mình là thế đấy ạ. B xem hàm main của mình có ổn không

10k bộ test, tất nhiên không thể chạy 10k lần
Những gì đã tính rồi thì không tính lại
Lưu lại các giá trị đã tính bằng mảng thôi

6 Likes

Không rõ miền giá trị của n là bao nhiêu, mình thử tính chay với 1 số giá trị:

  • n = 50: 3099044504245996706400 (vượt max unsigned long long int)
  • n = 100: 69720375229712477164533808935312303556800
  • n = 3000:
click me

22847894461813938324787222822295155626520232915824216105237897774727805140633168105820168598673665297737394363821893982077026488296602937720046364807587773796489783025226944516941046518450937017171785429431141987073696631513313312061633862695434988202568124031286571062333808079173774207670322971595068770115533134590866132761918466460637548134776251481209468487526830582994356063094582472919447686130281485594115245104783149522711182729241824706344381821536894504587283040900827475286886950352821165085243564154061343889964037553703329221474171037012337811072503963971246910441908932129168594480355234289302387626156176473792348927061794209178056169089968011349097613966353675079396003768506338930453318707549810703556166830751828090694300019026057410096573042343781107668206481428946487524489812637018569741858703026588634965923079160607677473435779415792703366320947220764530760950817851731487336611087118693032362060404630553487423847190874070444264355809840084886190614554426444914865140243591092320319334091591102170975335724328691661681664220767422457749579893554961073088330544578434610715585367551345174895209070231775187043423074291450445741940455756523233475867249562806024826006078088655728105057622080277344458682271292589931416026728802463640459349760312887533423223581399704459945857280000

  • n = 30000: hiển thị mất tầm 163 dòng, mỗi dòng là 81 ký tự.

Vấn đề của bạn không phải là bạn muốn tính trong khoảng unsigned long long là được.

4 Likes

Muốn tính với n bất kì có lẽ phải dùng string mất :no_mouth:. Chắc phải có giới hạn n thôi.

Có câu này nữa thì 99.99% là cộng trừ nhân chia với string cho vui nha.

Bài này ko cần phép chia :smiley: mà nhân bắt cặp đầu cuối là nhanh nhất.

Ngoài cách tính UCLN bằng Euclid thì còn cách dùng phân tích thừa số :slight_smile: giờ chỉ còn tìm số mũ đúng nữa thôi.

\prod_{p\ prime}^{n} p^{??}
6 Likes

unsigned long int != unsigned long long int nha

6 Likes

mình để là unsigned long long int luôn, mà vẫn bị Wrong

int temp=1;

sao trong main() lại đi xài int cho bcnn của n số :V :V Sao lại đặt tên là temp mà ko đặt tên khác cho dễ hiểu :V

8 Likes

oh shitt, tks bác
Giờ mới để ý, chỉnh sang unsigned long long int dc rồi bác ^^ , cảm ơn bác ở bài này nữa ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?