# Lời giải bài Khảo sát đầu năm Bài 1: Bài này khá là đơn giản khi đề chỉ yêu cầu tính tổng và lũy thừa của hai số $a$ và $n$. Nhưng điều đáng quan tâm của bài này đó chính là $a$ và $n$ rất lớn. Vì vậy, ta cần chia lấy dư cho $10^{9}$+$7$. ##### Phương pháp giải bài 1: + Subtask 1 (80%): Cách này cũng là cách đơn giản nhất, đề bảo sao thì làm vậy. Ta tính tổng hai số và chia lấy dư cho $10^{9}$+$7$. Nhưng phần lớn các bạn lại không chia lấy dư cho số này, nên chỉ được 0.4 điểm test nhỏ. + Subtask 2 (20%): Đây cũng là phần khó nhất của đề thi, vì ta phải giải quyết được với trường hợp số lớn. Để giải quyết được subtask này ta cần phải áp dụng phương pháp Nhân Ấn Độ và Đồng Dư thức để giải quyết. Phép nhân Ấn Độ được sử dụng để tính trong trường hợp tính chất phân phối với phép đồng dư thức không thể áp dụng được vì lí do tràn số. Nguyên lí phép nhân Ấn Độ như sau: ![image.png](https://hackmd.io/_uploads/HJTglRymT.png) Đây là cài đặt của phép nhân Ấn Độ cho 2 ngôn ngữ chính mà các bạn sử dụng là $Python$ và $C++$: Đối với $Python$: ```python= def power_modulo(a, b, M): # Ở đây với M là số dùng để chia lấy dư { if b == 0: return 1; half = power_modulo(a, b // 2, M) % M; half = multiply_modulo(half, half, M); if (b & 1) return multiply_modulo(half, a, M); else return half; } ``` Đối với $C++$: ```cpp= long long luythua(long long a, long long b) { if (b == 0) return 1; long long result = luythua(a, b / 2); result = (result * result) % MOD; if (b % 2 == 1) { result = (result * a) % MOD; } return result; } ``` Bài 2: Ở bài này đề yêu cầu ta kiểm tra thử 1 xâu có phải là xâu đối xứng hay không. Ta có thể nhận xét được rằng xâu đối xứng là 1 xâu nghịch đảo bằng chính nó là xâu đối xứng. Từ đó ta có thể giải bằng nhiều cách từ nhận xét này. ##### Phương pháp giải bài 2: + Cách 1: Tạo một xâu $t$ là đảo ngược của xâu $s$. + Cách 2: Cho chạy 2 con trỏ ($l$ từ đầu mảng đến cuối mảng cuối mảng) và ($r$ từ cuối mảng đến đầu mảng). Nệu tại $l$ và $r$ tương ứng nhau có giá trị khác nhau thì dừng lại và kết luận đây không phải xâu đối xứng. Bài 3: Bài cuối cùng nhưng lại là bài đơn giản nhất của đề. Ta chỉ cần in ra chữ số lớn nhất từ số $n$ được nhập vào. ##### Phương pháp giải bài 3: + Cách 1: Nếu bạn nào đã tìm hiểu về xâu thì bài này gần như là bài cho điểm. Vì chỉ cần in ra kí tự lớn nhất trong xâu. + Cách 2: Nếu đầu vào là một số thì ta cần tách từng số bằng cách chia lấy dư cho $10$ và đặt một biến $max$ ở ngoài là biến đáp án. Tiếp đến việc của ta là chỉ cần duyệt qua từng phần tử và tìm phần tử lớn nhất trong những chữ số được lấy ra đó. Tìm phần tử lớn nhất trong 1 dãy thì ta đã được học từ đầu năm Đây là code để giải những bài trên full 100%: Bài 1: $Python$: ```python= MOD = 1000000007 # 10^9 + 7 def luythua(a, b): if b == 0: return 1 result = luythua(a, b // 2) result = (result * result) % MOD if b % 2 == 1: result = (result * a) % MOD return result a, n = map(int, input().split()) S = (a + n) % MOD T = luythua(a, n) print(S) print(T) ``` $C++$: ```cpp= #include<bits/stdc++.h> using namespace std; const long long MOD = 1000000007; // 10^9 + 7 long long luythua(long long a, long long b) { if (b == 0) return 1; long long result = luythua(a, b / 2); result = (result * result) % MOD; if (b % 2 == 1) { result = (result * a) % MOD; } return result; } int main() { long long a, n; cin >> a >> n; long long S = (a + n) % MOD; long long T = luythua(a, n); cout << S << '\n'<< T; return 0; } ``` Bài 2: $Python$: ```python= t = int(input()) for i in range(t): s = input() if s == s[::-1]: print('YES') else: print('NO') ``` $C++$: ```cpp= #include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; cin.ignore(); for (int i = 0; i < t; i++) { string s; getline(cin, s); if (s == string(s.rbegin(), s.rend())) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0; } ``` Bài 3: $Python$: ```python= print(max(list(map(int, input())))) ``` $C++$: ```cpp= #include <bits/stdc++.h> #define int long long using namespace std;\ signed main() { int N; cin >> N; int maxDigit = 0; int digit; while (N > 0) { digit = N % 10; if (digit > maxDigit) { maxDigit = digit; } N /= 10; } cout <<maxDigit << endl; return 0; } ```