# OAI
::: spoiler **Mục lục**
[TOC]
:::
## IMPLEMENTATION
### I. Implementation Fundamentals
[I. Implementation Fundamentals](https://hackmd.io/8mi7YiLsQ1GC3RWtXYbS4A)
### II. Implementation (Đề hỏi gì làm nấy)
::::spoiler **1. Bitmask**
**1.1. IsZero(x)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
bool IsZero(int x){
return !(x&(-x));
}
int main(){
int n;
cin>>n;
cout<<(IsZero(n)?"YES":"NO");
return 0;
}
```
:::
==Giải thích :== Kiểm tra n có phải là số không không. Nếu có thì xuất "YES", không thì xuất "NO".
---
**1.2. IsOdd(X), IsEven(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
bool IsOdd(int x){
return x&1;
}
bool IsEven(int x){
return !(x&1);
}
int main(){
int a,b;
cin>>a>>b;
cout<<(IsOdd(a)?"YES":"NO");
cout<<(IsEven(b)?"YES":"NO");
return 0;
}
```
:::
==Giải thích :== Kiểm tra a có phải số lẻ và b có phải số chẵn không. Nếu có xuất "YES", không thì xuất "NO"
---
**1.3. IsPowerOfTwo(x)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
bool IsPowerOfTwo(long long x){
return (x>0&&(x&(x-1))==0) ;
}
int main(){
long long n;
cin>>n;
cout<<(IsPowerOfTwo(n)?"YES":"NO");
return 0;
}
```
:::
==Giải thích :== Kiểm tra n có phải là lũy thừa của hai không
---
**1.4. IsPowerOfFour(X), IsPowerOfPowerOfTwo(X, K)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
bool IsPowerOfFour(long long x){
return (x>0&&(x&(x-1))==0)&&(x & 0x55555555));
}
bool IsPowerOfPowerOfTwo(long long x,long long k){
if(x<=0||k<=0||x&(x-1)!=0) return false;
int cnt=0;
while(x){
x>>=1;
cnt++;
}
return (cnt%k==0);
}
int main(){
long long n;
cin>>n;
cout<<(IsPowerOfFour(n)?"YES":"NO");
long long x,y;
cin>>x>>y;
cout<<(IsPowerOfPowerOfTwo(x,y)?"YES":"NO");
return 0;
}
```
:::
==Giải thích:==
-Hàm IsPowerOfFour(x) được dùng để kiểm tra xem x có phải là lũy thừa của bốn không.
-Hàm IsPowerOfPowerOfTwo(x,k) được dùng để kiểm tra xem liệu có tồn tại một số p sao cho x= 2^p*k^.
---
**1.5. CheckBit(X, B) SetBit(X, B) UnsetBit(X, B) ToggleBit(X, B)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
bool CheckBit(long long x,long long b){
return ((x>>b)&1);
}
void SetBit(long long x,long long b){
return (x|(1<<b));
}
void UnsetBit(long long x,long long b){
return x&~(1<<b);
}
void ToggleBit(long long x,long long b){
return x^(1<<b);
}
int main(){
int n,b;
cin>>n>>b;
cout<<(CheckBit(n,b)?"YES":"NO");
SetBit(x,b);
cout<<x;
UnsetBit(x,b);
cout<<x;
ToggleBit(x,b);
ToggleBit(x,b-1);
cout<<x;
return 0;
}
```
:::
==Giải thích:==
-Hàm CheckbBit(x,b): kiểm tra vị trí bit thứ b của số nguyên x đã được bật chưa.
-Hàm SetBit(x,b): Bật bit thứ b của số nguyên x.
-Hàm UnsetBit(x,b): Tắt bit thứ b của số nguyên x.
-Hàm ToggleBit(x,b): Thay đổi giá trị của bit thứ b của số nguyên x.
---
**1.6.AssignBit(X, B, V)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
void AssignBit(long long x,long long b,long long v){
if(v) return x|(1<<b);
return x&~(1<<b);
}
int main(){
int n,b,v;
cin>>n>>b>>v;
AssignBit(n,b,v);
cout<<n;
return 0;
}
```
:::
==Giải thích:==
- Hàm AssignBit(x,b,v): gán giá trị (1 hoặc 0) cho bit thứ b của số nguyên x.
---
**1.7. ToBinary(X), ToOctet(X), ToHex(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
#include <bitset>
#include <algorithm>
using namespace std;
void ToBinary(long long& x){
bitset<32> bs(x);
cout<<bs;
}
string ToOctet(long long x){
if (x == 0) return "0";
string octal = "";
while (x > 0) {
octal += to_string(x % 8);
x /= 8;
}
reverse(octal.begin(), octal.end());
return octal;
}
string ToHex(long long x) {
if (x == 0) return "0";
string hexChars = "0123456789ABCDEF", hex;
while (num > 0) {
hex += hexChars[x % 16];
x /= 16;
}
reverse(hex.begin(), hex.end());
return hex;
}
int main(){
long long n;
cin>>n;
ToBinary(n);
string result;
result=ToOctet(n);
cout<<result;
result=ToHex(n);
cout<<result;
return 0;
}
```
:::
==Giải thích:==
-Hàm ToBinary(x): chuyển số nguyên x thành số nhị phân.
-Hàm ToOctet(x): chuyển số nguyên x thành số bát phân.
-Hàm ToHex(x): chuyển số nguyên x thành số thập lục phân.
---
**1.8. FullMask(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
#include <cstdint>
using namespace std;
inline uint64_t FullMask(long long x) {
if (x == 64) {
return ~uint64_t;
}
return ((uint64_t)1 << x) - 1;
}
int main(){
int n,m;
cin>>n>>m;
XorSwap(n,m);
cout<<n<<" "<<m;
return 0;
}
```
:::
==Giải thích:==
-Hàm XorSwap(x,y): đổi giá trị của hai số bằng xor.
---
**1.9. XorSwap(X,Y)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
void XorSwap(long long& x,long long& y){
x^=y;
y^=x;
x^=y;
}
int main(){
int n,m;
cin>>n>>m;
XorSwap(n,m);
cout<<n<<" "<<m;
return 0;
}
```
:::
==Giải thích:==
-Hàm XorSwap(x,y): đổi giá trị của hai số bằng xor.
---
**1.10. BitLength(X), Log2(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
int BitLength(long long x) {
if(x==0)return 0;
int cnt = 0;
while(x>0) {
x>>=1;
cnt++;
}
return cnt;
}
long long Log2(long long x){
long long cnt=0;
while(x){
x>>=1;
cnt++;
}
return cnt-1;
}
int main() {
long long x; cin >> x;
cout<<BitLength(x)<<"\n";
cout<<Log2(x);
return 0;
}
```
:::
==Giải thích:==
-Hàm BitLength(x): tính độ dài bit của số X (số bit cần thiết để thể hiện số X).
-Hàm Log2(x): trả về giá trị log~2~x.
---
**1.11.CountSetBit(X), CountUnsetBit(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
#include <bitset>
using namespace std;
long long CountSetBit(long long x){
long long cnt=0;
while(x){
cnt+=x&1;
x>>=1;
}
return cnt;
}
long long CountUnsetBit(long long x){
return 16-CountSetBit(x);
}
int main(){
long long x;
cin>>x;
cout<<CountSetBit(x)<<'\n'<<CountUnsetBit(x);
return 0;
}
```
==Giải thích:==
-Hàm CountSetBit(x): Đếm số bit đã được bật của số nguyên x.
-Hàm CountUnsetBit(x): Đếm số bit chưa được bật của số nguyên x.
---
**1.12.CountTrailingZero(X), CountTrailingOne(X)**
```cpp=
#include <isotream>
using namespace std;
long long CountTrailingZero(long long x){
if(!(x)) return 16;
long long cnt=0;
while(!(x&1)){
cnt++;
x>>=1;
}
return cnt;
}
long long CountTrailingOne(long long x){
long long cnt=0;
while((x&1)){
cnt++;
x>>=1;
}
return cnt;
}
int main(){
long long x;
cin>>x;
cout<<CountTrailingZero(x)<<'\n'<<CountTrailingOne(x);
return 0;
}
```
:::
==Giải thích:==
-Hàm CountTrailingZero(x): trả về số lượng chuỗi chữ số 0 ở cuối.
-Hàm CountTrailingOne(x): trả về số lượng chuỗi chữ số 1 nối nhau ở cuối.
---
**1.13.CountLeadingZero(X), CountLeadingOne(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
int BitLength(long long x) {
if(x==0)return 16;
int cnt=0;
while(x>0) {
x>>=1;
cnt++;
}
return cnt;
}
long long CountLeadingZero(long long x){
return 16-BitLength(x);
}
long long CountLeadingOne(long long x){
long long cnt=0;
for(int i=16;i>=0;--i){
if(!((x>>i)&1)) break;
cnt++;
}
return cnt;
}
int main(){
long long n;
cin>>n;
cout<<CountLeadingZero(n)<<'\n'<<CountLeadingOne(n);
return 0;
}
```
:::
==Giải thích:==
-Hàm CountLeadingZero(x): Trả về số lượng chuỗi chữ số 0 ở đầu.
-Hàm CountLeadingOne(x): Trả về số lượng chuỗi chữ số 1 ở đầu.
---
**1.14.LeastSignificantBit(X), MostSignificantBit(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
// idk,idu ;-; ?
```
:::
==Giải thích:==
-Hàm LeastSignificantBit(X):
-Hàm MostSignificantBit(X):
---
**1.15.BitLeftRotation(X, N), BitRightRotation(X, N)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long BitLeftRotation(long long x,long long n){
return (x<<n)|(x>>(32-n));
}
long long BitRightRotation(long long x,long long n){
return (x>>n)|(x<<(32-n));
}
int main(){
long long x,n;
cin>>x>>n;
long long x1,n1;
cin>>x1>>n1;
cout<<BitLeftRotation(x,n)<<'\n'<<BitRightRotation(x1,n1);
return 0;
}
```
:::
==Giải thích:==
-Hàm BitLeftRotation(x,n): Đẩy bit, của số nguyên x, sang trái n bit.
-Hàm BitRightRotation(x,n): Đẩy bit, của số nguyên x, sang phải n bit.
---
**1.16.SubmaskEnumeration(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
void SubmaskEnumeration(long long x){
for(long long i=x;i;i=(i-1)&x){
cout<<i<<'\n';
}
}
int main(){
long long n;
cin>>n;
SubmaskEnumeration(n);
return 0;
}
```
:::
==Giải thích:==
-Hàm SubmaskEnumeration(x): Liệt kê các submask của x.
---
**1.17.SignOf(X), IsPositive(X), IsNegative(X), HasOppositeSign(X, Y)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
char SignOf(long long x){
if((x>0)-(x<0)) return '+';
else if(!((x>0)-(x<0))) return '-';
return '0';
}
bool IsPositive(long long x){
return (x>0);
}
bool IsNegative(long long x){
return (x<0);
}
bool HasOppositeSign(long long x,long long y){
return ((x^y)<0);
}
int main(){
long long a,b;
cin>>a>>b;
cout<<SignOf(a)<<'\n'<<IsPositive(a)<<'\n'<<IsNegative(b)<<'\n'<<HasOppositeSign(a,b);
return 0;
}
```
:::
==Giải thích:==
-Hàm SignOf(x): Kiểm tra dấu của x.
-Hàm IsPositive(x): Kiểm tra xem x có dương không.
-Hàm IsNegative(x): Kiểm tra xem x có âm không.
-Hàm HasOppositeSign(x,y): Kiểm tra x và y có trái dấu nhau không.
---
**1.18.IsolateLowestSetBit(X), ClearLowestSetBit(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long IsolateLowestSetBit(long long x){
return x&-x;
}
long long ClearLowestSetBit(long long x){
return x&(x-1);
}
int main(){
int n;
cin>>n;
cout<<IsolateLowestSetBit(x)<<'\n'<<ClearLowestSetBit(x);
return 0;
}
```
:::
==Giải thích:==
-Hàm IsolateLowestSetBit(x): trả về dãy bit chỉ có bit đã được bật tại vị trí thấp nhất của x.
-Hàm ClearLowestSetBit(x): xóa bit được bật tại vị trí thấp nhất của x.
---
**1.19.BitAbs(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
long long BitAbs(long long x) {
const long long bits=sizeof(long long)*8;
long long mask=x>>(bits-1);
return (x^mask)-mask;
}
int main() {
long long x; cin>>x;
cout<<BitAbs(x);
}
```
:::
==Giải thích:==
- Hàm BitAbs(): Trả về giá trị tuyệt đối của số thông qua bit.
---
**1.20.BitMin(X, Y), BitMax(X, Y)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long BitMin(long long x,long long y){
return y^((x^y)&-(x<y));
p ppppppppppppppppp }
long long BitMax(long long x,long long y){
return x^((x^y)&-(x<y));
}
int main(){
long long x,y,a,b;
cin>>x>>y>>a>>b;
cout<<BitMin(x,y)<<'\n'<<BitMax(a,b);
return 0;
}
```
:::
==Giải thích:==
-Hàm BitMin(X,Y): tìm số nhỏ nhất giữa hai số bằng bit.
-Hàm BitMax(X,Y): tìm số lớn nhất giữa hai số bằng bit.
---
**1.21.LexicoNextBitPermutation(X), LexicoPrevBitPermutation(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long
int main(){
}
```
:::
-Hàm LexicoNextBitPermutation(X): idk
-Hàm LexicoPrevBitPermutation(X): idk
---
**1.22.NextPowerOfTwo(X), PrevPowerOfTwo(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <isotream>
using namespace std;
long long NextPowerOfTwo(long long x){
if(!(x)) return 1;
x--;
x|=x>>1;
x|=x>>2;
x|=x>>4;
x|=x>>8;
x|=x>>16;
return x+1;
}
long long PrevPowerOfTwo(long long x){
if(x==0) return x;
return 1 << (31 - __builtin_clz(x));
}
int main(){
long long n;
cin>>n;
cout<<NextPowerOfTwo(n)<<'\n'<<PrevPowerOfTwo;
return 0;
}
```
:::
==Giải thích:==
-Hàm NextPowerOfTwo(x): trả về lũy thừa của hai bé nhất không nhỏ hơn x.
-Hàm NextPowerOfTwo(x): trả về lũy thừa của hai lớn nhất không lớn hơn x.
---
**1.23.GrayCode(X) InverseGrayCode(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
int main(){
}
```
:::
-Hàm GrayCode(x): idk
-Hàm InverseGrayCode(x): idk
---
**1.24.ReverseBit(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ReverseBit(long long x){
}
```
:::
==Giải thích:== Đảo ngược số bằng bit.
---
**1.25.GenAllBinary(N) GenAllTernary(N) GenAllQuaternary(N) GenAllGrayCode(N)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
// wth ;-;
```
:::
::::
::::spoiler **2.Bitmask Bultin**
::::
::::spoiler **3.Modular Arithmetic**
[SPY_MOD](https://hackmd.io/@spyofgame/oai#II3---Modular-Arithmetic)
**3.1.ModFix(A, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModFix(long long a,long long p){
return a%p;
}
int main(){
long long x,y;
cin>>x>>y
cout<<ModFix(x, y);
return 0;
}
```
:::
==Giải thích:==
-Hàm :
**3.2.ModNeg(A, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModNeg(long long a,long long p){
reuturn abs(a)%p;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<ModNeg(x,y);
return 0;
}
```
:::
-Hàm :
**3.3.ModInc(A, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModInc(long long a,long long p){
return (a+1)%p;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<ModInc(x,y);
return 0;
}
```
-Hàm:
:::
-Hàm:
**3.4.ModDec(A,P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModDec(long long a,long long p){
return (a-1)%p;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<ModDec(x,y);
return 0;
}
```
-Hàm :
:::
**3.5.ModInv(A, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModInv(long long a,long long p){
return 1/a%p;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<ModInv(x,y);
return 0;
}
```
-Hàm :
:::
**3.6.ModFib(N, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModFib(long long n,long long p){
if(n==1||n==0) return n;
return (ModFib(n-1)%p+ModFib(n-2)%p)%p;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<ModFib(x,y);
return 0;
}
```
-Hàm :
:::
**3.7.ModLucas(N, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModLucas(long long n,long long p){
if(n==1) return 1;
if(n==0) return 2;
return (ModLucas(n-1,p)%p+ModLucas(n-2,p)%p)%p;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<ModLucas(x,y);
return 0;
}
```
-Hàm :
:::
**3.8.ModFac(N, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModFact(long long n,long long p){
if(n==1) return 1;
return (n%p*ModFact(n-1,p)%p)%p;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<ModFact(x,y);
return 0;
}
```
-Hàm :
:::
**3.9.ModInvFact(N, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModInvFact(long long n,long long p){
if(n==1) return 1;
return ((1/n%p*1)/(ModFact(n-1,p)%p))%p;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<ModInvFact(x,y);
return 0;
}
```
-Hàm :
:::
**3.10.ModAdd(A, B, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModAdd(long long a,long long b,long long p){
return (a%p+b%p)%p;
}
int main(){
long long x,y,p;
cin>>x>>y>>p;
cout<<ModAdd(x,y,p);
return 0;
}
```
-Hàm :
:::
**3.11.ModSub(A, B, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModSub(long long a,long long b,long long p){
return (a%p-b%p)%p;
}
int main(){
long long x,y,p;
cin>>x>>y>>p;
cout<<ModSub(x,y,p);
return 0;
}
```
-Hàm :
:::
**3.12.ModMul(A, B, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModMul(long long a,long long b,long long p){
return (a%p*b%p)%p;
}
int main(){
long long x,y,p;
cin>>x>>y>>p;
cout<<ModMul(x,y,p);
return 0;
}
```
-Hàm :
:::
**3.13.ModDiv(A, B, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModDiv(long long a,long long b,long long p){
return (a%p*(1/b)%p)%p;
}
int main(){
long long x,y,p;
cin>>x>>y>>p;
cout<<ModDiv(x,y,p);
return 0;
}
```
-Hàm :
:::
**3.14.ModPow(A, B, P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModPow(long long x,long long n,long long p){
int res=1;
for(int i=0;i<n;++i){
res*=x%p;
}
return res%p;
}
int main(){
long long x,y,p;
cin>>x>>y>>p;
cout<<ModPow(x,y,p);
return 0;
}
```
-Hàm :
:::
**3.15.DivFloor(X, Y)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long DivFloor(long long x,long long y){
return x/y;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<Divfloor(x,y);
return 0;
}
```
-Hàm :
:::
**3.16.DivCeil(X, Y)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long DivCeil(long long x,long long y){
return (x+y-1)/y;
}
int main(){
long long x,y;
cin>>x>>y;
cout<<DivCeil(x,y);
return 0;
}
```
-Hàm :
:::
**3.17.DivRound(X, Y)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long DivRound(long long x,long long y){
return long long(long double(x)/y+0,5);
}
int main(){
long long x,y;
cin>>x>>y;
cout<<DivCeil(x,y);
return 0;
}
```
-Hàm :
:::
**3.18.GCD(X, Y)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long GCD(long long x,long long y){
if(!(y)) return x;
return GCD(y,x%y);
}
int main(){
long long x,y;
cin>>x>>y;
cout<<GCD(x,y);
return 0;
}
```
-Hàm :
:::
**3.19.LCM(X, Y)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long GCD(long long x,long long y){
if(!(y)) return x;
return GCD(y,x%y);
}
long long LCM(long long x,long long y){
return x*y/GCD(x,y);
}
int main(){
long long x,y;
cin>>x>>y;
cout<<LCM(x,y);
return 0;
}
```
-Hàm :
:::
**3.20.ExtGCD(X,Y)**
**3.21.ModAnk(N,K,P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModFact(long long n,long long p){
if(n==1) return 1;
return (n%p*ModFact(n-1,p)%p)%p;
}
long long ModAnk(long long n,long long k,long long p){
return (ModFact(n,p)/ModFact(n-k,p))%p;
}
int main(){
long long x,y,bruh;
cin>>x>>y>>bruh;
cout<<ModAnk(x,y,bruh);
return 0;
}
```
-Hàm :
:::
**3.22.ModEq(A,B,P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
bool ModEq(long long a,long long b,long long p){
return (a%p==b%p);
}
int main(){
long long x,y,p;
cin>>x>>y>>p;
cout<<(ModEq(x,y,p)?"YES":"NO");
return 0;
}
```
-Hàm :
:::
**3.23.ModPow2(A,B,P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModPow2(long long n,long long p){
int res=1;
for(int i=0;i<n;++i){
res=(res*2)%p;
}
return res;
}
int main(){
long long x,p;
cin>>x>>p;
cout<<ModPow2(x,p);
return 0;
}
```
-Hàm :
:::
**3.23.ModSquare(A,B,P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModSquare(long long n,long long p){
int res=n%p;
return (res*res)%p ;
}
int main(){
long long x,p;
cin>>x>>p;
cout<<ModSquare(x,p);
return 0;
}
```
-Hàm :
:::
**3.24.ModDiv2(A,B,P)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
long long ModDiv2(long long n,long long p){
int res=n%p;
return (res/2)%p ;
}
int main(){
long long x,p;
cin>>x>>p;
cout<<ModDiv2(x,p);
return 0;
}
```
-Hàm :
:::
::::
::::spoiler **4.Number Theory**
**3.25.IsSquare(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
bool IsCube(long long x){
int i=0;
for(;i*i<=x;++i){
if(i*i==x) return true;
}
return false;
}
int main(){
long long x;
cin>>x;
cout<<(IsSquare(x)?"YES":"NO");
return 0;
}
```
-Hàm :
:::
**3.26.IsCube(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
bool IsCube(long long x){
int i=0;
for(;i*i*i<=x;++i){
if(i*i*i==x) return true;
}
return false;
}
int main(){
long long x;
cin>>x;
cout<<(IsCube(x)?"YES":"NO");
return 0;
}
```
-Hàm :
:::
**3.27.IsKthRoot(X)**
**3.28.SqrtFloor(X)**
**3.29.SqrtCeil(X)**
**3.30.IsSqrtOf(X, N)**
**3.31.IsPrime(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
bool IsPrime(long long x){
if(n<=1) return false;
if(n==2||n==3) return true;
if(n%2==0||n%3==0) return false;
for(int i=5;i*i<=n;i+=6){
if(n%i==0||n%(i+2)==0)return false;
}
return true;
}
int main(){
long long x;
cin>>x;
cout<<(IsPrime(x)?"YES":"NO");
return 0;
}
```
-Hàm :
:::
**3.32.IsPrime(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
using namespace std;
const int maxn = 1000000 + 5;
bool is_prime[maxn];
void Sieve(int n){
for (int i = 2; i <= n; i++)
is_prime[i] = true;
for (int i = 2; i * i <= n; i++) {
if (is_prime[i]) {
for (int j = i * i; j <= n; j += i)
is_prime[j] = false;
}
}
}
int main(){
long long n;
cin>>n;
Sieve(1000005);
int cnt=0;
for(int i=2;cnt<n;++i){
if(is_prime[i]) {cout<<i<<" ";cnt++;}
}
return 0;
}
```
-Hàm :
:::
**3.33.DivisorsOf(X)**
:::spoiler **CODE và giải thích**
```cpp=
#include <iostream>
#include <vector>
using namespace std;
vector<int> DivisorsOf(long long x){
int n=DivisorsOf.size()
}
int main(){
long long x;
cin>>x;
cout<<(DivisorsOf(x)?"YES":"NO");
return 0;
}
```
-Hàm :
:::
::::