01/10/2018, 13:28

Hỏi về thuật toán lấy số dư của phép chia một lũy thừa cho 1 số nhỏ

Em có 1 bài là tính số dư của 1 số có luỹ thừa cực lớn (vd 99999 ^ 99999) cho 1 số (vd 1333 chẳng hạn), thì có thuật toán nào nhanh không ạ @@, hay các bác cho em 1 từ khoá em search gg cũng được.
liệu có quan hệ nào giữa các chữ số của luỹ thừa với số dư hay gì gì đó không ạ @@. Em cảm ơn mọi người !

HK boy viết 15:31 ngày 01/10/2018

Bạn đọc 2 bài trong link này:

GitHub

drgnz/diễn đànWiki

diễn đànWiki - Dạy Nhau Học Wiki cho thành viên mới

Hieu Hoang viết 15:41 ngày 01/10/2018

a^b%x=(a%x)^b % x
(axb)%x=(a%x)x(b%x) % x

Nguyễn Dương viết 15:37 ngày 01/10/2018

em học hơi giốt toán, nếu áp dụng cái trên vẫn ra số rất lớn ví dụ vẫn ra là (5^9999 %x) thì áp dụng cái công thức thứ 2 phân tích kiểu gì ạ @@ đội hơn bác !!1

Hieu Hoang viết 15:36 ngày 01/10/2018

ko chia nhỏ cơ số ra đc nữa thì chia nhỏ lũy thừa thôi :3

rogp10 viết 15:35 ngày 01/10/2018

Lũy thừa có cách riêng mà đổi số mũ ra nhị phân rồi nhìn theo đó nhân vào.

Nguyễn Dương viết 15:28 ngày 01/10/2018

chuyển luỹ thừa sang nhị phân ạ ? sau đó tính kiểu gì, em không biết cái cách ấy mới hỏi các bác chứ @@@

HK boy viết 15:31 ngày 01/10/2018

giốt

dốt.

sau đó tính kiểu gì

Đọc bài này:

Giờ rảnh được chút, làm thêm một bài nữa về một thuật toán cơ bản: tính lũy thừa an bằng phương pháp chia để trị. Chắc mọi người đa số hay dùng vòng lặp nhỉ (cứ ừ đại đi), bây giờ đổi gió xíu nhé Vào luôn vấn đề, như mọi người đã biết, an được tính bằng cách nhân n lần số a (nói vậy cho gọn đi) Mình lấy ví dụ: a8 = a . a . a . a . a . a . a . a (8 chữ a lận nhé) Ta nhận thấy rằng có thể chia nửa cái phép tính trên kia ra, như thế này: a8 = a4 + 4 = a4 . a4 trong đó, a4 có thể được tí…
viết 15:34 ngày 01/10/2018
#include <iostream>
#include <cstdint>

// Calculate (a * b) mod m
int32_t modmul(int32_t a, int32_t b, int32_t m)
{
    return static_cast<int32_t>(static_cast<int64_t>(a) * b % m);
}

// Calculate (a ^ e) mod m
int32_t modpow(int32_t a, int32_t e, int32_t m)
{
    int32_t ret = e % 2 ? a : 1;
    while (e >>= 1)
    {
        a = modmul(a, a, m);
        if (e % 2) ret = modmul(ret, a, m);
    }
    return ret;
}

int main()
{
    std::cout << modpow(99999, 99999, 1333);
}

khỏi đệ quy

32_t 64_t nhức mắt quá thì cứ phang int với long long cũng tạm được

Bài liên quan
0