Tìm số cuối cùng


Submit solution

Points: 2
Time limit: 1.0s
Memory limit: 977M

Author:
Problem type
Allowed languages
Ada, Assembly, Awk, C, C++, C11, CLANG, CLANGX, Classical, COBOL, Coffee, CSC, D lang, DART, F95, FORTH, Fortrn, GAS32, GO, Haskell, Itercal, Java, kotlin, LEAN, LISP, LUA, MONOVB, Nasm, OCAML, Pascal, Perl, php, PIKE, prolog, Pypy, Python, Ruby 2, RUST, Scala, SCM, SED, SWIFT, TCL, TUR, V8JS, VB, ZIG

Cho 2 số \(N\) và \(M\)

Bạn hãy giúp Han tìm chữ số tận cùng của \(N^M\) nhé.

Input

2 số \(N (1 \le N \le 100)\), \(M (1 \le M \le 10^6)\)

Output

Chữ số cuối cùng của \(N^M\)

VD

Input

3 5

Output

3

Comments


  • 0
    TrinhMinhQuang_KTMT_K65  commented on Nov. 26, 2024, 11:37 a.m. edit 2

    #include <bits/stdc++.h> using namespace std; int i, a, b, s = 1; signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> a >> b; for (i = 1; i <= b; i++) { s *= a; s %= 10; } cout << s; }


  • 0
    TranVanDung_CNTT3_K63  commented on Feb. 13, 2023, 1:38 p.m.

    Cho em xin test case 7 với ạ !


  • 0
    LaHongPhuc_CNTTVA_k62  commented on Nov. 18, 2021, 6:58 a.m.

    cho em xin testcase 6 voi a


  • 1
    manh_ĐTVT5_K60  commented on Sept. 6, 2021, 1:56 p.m. edited
    console.writeline(math.pow(n,m).toString()[math.pow(n,m).toString().length()-1])

  • 2
    ga123  commented on Sept. 3, 2021, 4:31 p.m.

    NẾU KHÔNG LÀM ĐƯỢC THÌ MỚI ĐỌC.

    Đây là bài tập điển hình của việc xử lý overflow trong lập trình, chứng minh rõ ràng việc lập trình là tìm 1 góc nhìn mới.

    • Thông thường với các bài như thế này, chúng ta sẽ xử lý bằng code cơ bản . đề bài yêu cầu tìm số cuối nên có 2 cách chính để xử lý:
      • sử dụng pointer để tìm kí tự cuối cùng của số.
      • sử dụng thuật toán chia cho 10 mũ cao nhằm tìm kí tự đầu và trừ dần đi . sau đây là 1 code ví dụ của thuật toán thứ 2 nói trên:
        #include"bits/stdc++.h"
        using namespace std;
        long long countDigit(long long n)
        {
        long long count = 0;
        while (n != 0)
        {
            n = n / 10;
            ++count;
        }
        return count;
        }
        int main()
        {
        long long a,b,c,i;
        cin>>a>>b;
        c=pow(a,b);
        long long d=countDigit(c);
        for(i=d;i>1;i--)
        {
        long long e=c/pow(10,i-1);
        c=c-e*pow(10,i-1);
        }
        cout<<c;
        };
        Tuy nhiên , nếu xét rằng kích thước tối đa hiện tại của 1 số , ví dụ 3 mũ 200 đã là 10 mũ 95 , nên chắc chắn sẽ bị overflow. Dùng cách khác để nhìn vấn đề, ta nhớ lại cách nhân của hai số: lấy kí tự cuối cùng của số sau lần lượt nhân vào từng phần tử của số trước, rồi lấy tổng của từng đợt nhân cộng vào nhau.vậy là chỉ cần lấy kí tự số trước nhân với kí tự của số sau là đủ để tìm. Bạn hãy tự viết code :3 chỉ khi không thể làm được thì tham khảo code bên dưới.
        #include"bits/stdc++.h"
        using namespace std;
        long countDigit(long n)
        {
        long count = 0;
        while (n != 0)
        {
            n=n/10;
            ++count;
        }
        return count;
        }
        int main()
        {
        long a,b,c,i,d,j;
        cin>>a>>b;
        c=1;//khởi tạo c bằng 1 giá trị an toàn để không làm thay đổi kết quả
        for(i=1;i<=b;i++)
        {
        c=c*a;
        d=countDigit(c);//gán c bằng kí tự cuối của a, đề phòng trường hợp overflow.
        for(j=d;j>1;j--)
        {
        long e=c/pow(10,j-1);//tìm kí tự đầu
        c=c-e*pow(10,j-1);//khử kí tự đầu đến khi chỉ còn 1 kí tự.
        }
        }
        cout<<"\n\n"<<c;//in ra kí tự tìm được sau khi khử hết.
        }

  • 0
    learn_code_2020  commented on Oct. 13, 2020, 2:23 p.m.

    Đề bài cho 1<=N<=100 mà test case toàn N>100