跳到主要内容
基础算法技巧总结:数据结构与数论模板 | 极客日志
Java java 算法
基础算法技巧总结:数据结构与数论模板 综述由AI生成 总结了基础算法技巧与数据结构实现,涵盖高精度运算、位运算、离散化、KMP 算法、进制转换等零碎知识点。详细介绍了单链表、双链表、栈、队列、单调栈、单调队列、Trie 树及哈希表等数据结构的代码模板。此外还包括数论部分的质数筛选、约数分解、快速幂、组合数计算及博弈论基础。内容提供 C++ 与 Java 两种语言实现,适合算法学习与复习参考。
kaikai 发布于 2026/3/29 更新于 2026/5/30 31 浏览1.算法技巧零碎点
1.1 高精度算法
Java 提供 BigInteger 与 BigDecimal 两个类实现高精度运算
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main (String[] args) { Scanner sc=new Scanner (System.in); String n1=sc.next(); String n2=sc.next(); BigInteger b1=new BigInteger (n1); BigInteger b2=new BigInteger (n2); BigInteger sum=b1.add(b2);
import java.math.BigDecimal; import java.util.Scanner; public class Main { public static void main (String[] args) { Scanner sc=new Scanner (System.in); String n1=sc.next(); String n2=sc.next(); BigDecimal b1=new BigDecimal (n1); BigDecimal b2=new BigDecimal (n2); BigDecimal sum=b1.add(b2);
1.2 位运算
1.2.1 统计二进制中 1 的个数
#include <bits/stdc++.h> using namespace std; const int N=1e6+10; int arr[N]; int n;
import java.util.Scanner; public class Main { public static final int N= (int ) (1e6 +10 ); public static int n; public static int []arr=new int [N]; public static void main (String[] args) { Scanner sc=new Scanner (System.in); n=sc.nextInt(); for (int i=1 ;i<=n;i++) arr[i]=sc.nextInt(); for (int i=1 ;i<=n;i++){ int cnt=0 ; while (arr[i]!=0 ){ arr[i]-=lowBit(arr[i]); cnt++; } System.out.print(cnt+" " ); } } private static int lowBit (int x) { return x&-x; } }
1.3 离散化
1.3.1 区间和 #include <bits/stdc++.h> using namespace std; const int N=3e5+10; typedef pair<int,int> PII; int n,m; int arr[N],preSum[N]; vector<int> alls;
import java.util.*; class Node { int x,y; public Node (int x,int y) { this .x=x; this .y=y; } } public class Main { public static final int N= (int ) (3e5 +10 ); public static int n,m; public static int []arr=new int [N]; public static int []preSum=new int [N]; public static Set<Integer> set=new TreeSet <>();
1.4 KMP #include <bits/stdc++.h> using namespace std; const int N=1e6+10; int n,m; char p[N];
import java.util.*; public class Main { public static final int N = (int ) (1e6 + 10 ); public static int n, m; public static char [] p, s;
1.5 进制转化 import java.util.*; public class Main { public static void main (String[] args) { Scanner sc = new Scanner (System.in); String s1=sc.next();
1.6 时间转化 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class Main { public static void main (String[] args) throws ParseException { Scanner sc = new Scanner (System.in); SimpleDateFormat sdf=new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss" ); sdf.setTimeZone(TimeZone.getTimeZone("UTC" ));
2.基础数据结构
2.1 单链表 #include <bits/stdc++.h> using namespace std; const int N=1e6+10; int head,e[N],ne[N],idx; void init(){ head=-1; idx=0; } void add_to_head(int x){ e[idx]=x; ne[idx]=head; head=idx++; } void del(int k){ ne[k]=ne[ne[k]]; } void insert(int k,int x){ e[idx]=x; ne[idx]=ne[k]; ne[k]=idx++; } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int m; cin>>m; init();
import java.util.*; public class Main { public static final int N= (int ) (1e6 +10 ); public static int m; public static int head,idx; public static int []e=new int [N]; public static int []ne=new int [N]; public static void main (String[] args) { Scanner sc=new Scanner (System.in); m=sc.nextInt(); init(); for (int i=1 ;i<=m;i++){ char op; op=sc.next().charAt(0 ); if (op=='H' ){ int x=sc.nextInt(); addToHead(x); } else if (op=='D' ){ int k=sc.nextInt(); if (k==0 ) head=ne[head]; else del(k-1 ); } else { int k=sc.nextInt(); int x=sc.nextInt(); insert(k-1 ,x); } } for (int i=head;i!=-1 ;i=ne[i]){ System.out.print(e[i]+" " ); } } private static void init () { head=-1 ; idx=0 ; } private static void addToHead (int x) { e[idx]=x; ne[idx]=head; head=idx++; } private static void del (int k) { ne[k]=ne[ne[k]]; } private static void insert (int k,int x) { e[idx]=x; ne[idx]=ne[k]; ne[k]=idx++; } }
2.2 双链表 #include <bits/stdc++.h> using namespace std; const int N=1e6+10; int m; int e[N],l[N],r[N],idx;
2.3 模拟栈 #include <bits/stdc++.h> using namespace std; const int N=1e6+10; int m; int stk[N]; int top; int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>m; for(int i=1;i<=m;i++){ string op; cin> >op; if (op=="push" ){ int x; cin>>x; stk[++top]=x; } else if (op=="pop" ){ top--; } else if (op=="empty" ){ if (top==0) cout<<"YES" <<endl; else cout<<"NO" <<endl; } else { cout<<stk[top]<<endl; } } return 0; }
import java.util.*; public class Main { public static final int N= (int ) (1e6 +10 ); public static int m; public static int []stack=new int [N]; public static int top; public static void main (String[] args) { Scanner sc = new Scanner (System.in); m=sc.nextInt(); for (int i=1 ;i<=m;i++){ String op=sc.next(); if (op.equals("push" )){ int x=sc.nextInt(); stack[++top]=x; } else if (op.equals("pop" )){ top--; } else if (op.equals("empty" )){ if (top==0 ) System.out.println("YES" ); else System.out.println("NO" ); } else { System.out.println(stack[top]); } } } }
2.4 模拟队列 #include <bits/stdc++.h> using namespace std; const int N=1e6+10; int m; int q[N]; int l=0,r=-1; int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>m; for(int i=1;i<=m;i++){ string op; cin> >op; if (op=="push" ){ int x; cin>>x; q[++r]=x; } else if (op=="pop" ){ l++; } else if (op=="empty" ){ if (l>r) cout<<"YES" <<endl; else cout<<"NO" <<endl; } else { cout<<q[l]<<endl; } } return 0; }
import java.util.*; public class Main { public static final int N= (int ) (1e6 +10 ); public static int m; public static int []q=new int [N]; public static int r=-1 ,l=0 ; public static void main (String[] args) { Scanner sc = new Scanner (System.in); m=sc.nextInt(); for (int i=1 ;i<=m;i++){ String op=sc.next(); if (op.equals("push" )){ int x=sc.nextInt(); q[++r]=x; } else if (op.equals("pop" )) { l++; } else if (op.equals("empty" )){ if (l>r) System.out.println("YES" ); else System.out.println("NO" ); }else { System.out.println(q[l]); } } } }
2.5 单调栈
2.5.1 模板 #include <bits/stdc++.h> using namespace std; const int N=1e5+10; int n; int stk[N]; int top; int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ int x; cin> >x; while(top!=0 && stk[top]>=x){ top--; } if (top==0) cout<<"-1" <<" " ; else cout<<stk[top]<<" " ; stk[++top]=x; } return 0; }
import java.util.*; public class Main { public static final int N= (int ) (1e5 +10 ); public static int n; public static int [] stack=new int [N]; public static int top; public static void main (String[] args) { Scanner sc = new Scanner (System.in); n=sc.nextInt(); for (int i=1 ;i<=n;i++){ int x=sc.nextInt(); while (top!=0 && stack[top]>=x){ top--; } if (top==0 ) System.out.print("-1" +" " ); else System.out.print(stack[top]+" " ); stack[++top]=x; } } }
2.5.2 每日温度 class Solution { public static int [] stk; public static int [] res; public int [] dailyTemperatures(int [] temperatures) { int n=temperatures.length; int top=0 ; stk=new int [n]; res=new int [n]; for (int i=0 ;i<n;i++){ int t=temperatures[i]; while (top!=0 && t>temperatures[stk[top]]){ int idx=stk[top--]; res[idx]=i-idx; } stk[++top]=i; } return res; } }
2.6 单调队列
2.6.1 滑动窗口 #include <bits/stdc++.h> using namespace std; const int N=1e6+10; int n,k; int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>k; vector<int> arr(n); for(int i=0;i<n;i++) cin> >arr[i]; deque<int> q;
import java.util.*; public class Main { public static int n,k; public static int []arr; public static void main (String[] args) { Scanner sc = new Scanner (System.in); n=sc.nextInt(); k=sc.nextInt(); arr=new int [n+10 ]; for (int i=0 ;i<n;i++) arr[i]=sc.nextInt(); ArrayDeque<Integer> q=new ArrayDeque <>();
2.7 Tire 树
2.7.1 Tire 字符串统计 #include <bits/stdc++.h> using namespace std; const int N=1e5+10; int idx; int son[N][26];
import java.util.*; public class Main { public static final int N= (int ) (1e5 +10 ); public static int n,m; public static int [][]son=new int [N][26 ]; public static int []cnt=new int [N]; public static int idx; public static void main (String[] args) { Scanner sc = new Scanner (System.in); n=sc.nextInt(); for (int i=0 ;i<n;i++){ char c; String s; c=sc.next().charAt(0 ); s=sc.next(); if (c=='I' ) insert(s); else System.out.println(query(s)); } } public static void insert (String s) { int p=0 ; for (int i=0 ;i<s.length();i++){ int x=s.charAt(i)-'a' ; if (son[p][x]==0 ){ son[p][x]=++idx; } p=son[p][x]; } cnt[p]++; } public static int query (String s) { int p=0 ; for (int i=0 ;i<s.length();i++){ int x=s.charAt(i)-'a' ; if (son[p][x]==0 ) return 0 ; p=son[p][x]; } return cnt[p]; } }
2.7.2 最大异或对 #include <bits/stdc++.h> using namespace std; const int N=1e5+10; const int M=N*31;
import java.util.*; public class Main { public static final int N= (int ) (1e5 +10 ),M=N*31 ; public static int n; public static int []arr=new int [N]; public static int [][]son=new int [M][2 ]; public static int idx; public static void main (String[] args) { Scanner sc = new Scanner (System.in); n=sc.nextInt(); for (int i=0 ;i<n;i++){ arr[i]=sc.nextInt(); } int res=0 ; for (int i=0 ;i<n;i++){ insert(arr[i]); int t=query(arr[i]); res=Math.max(res,t^arr[i]); } System.out.println(res); } public static void insert (int x) { int p=0 ; for (int i=30 ;i>=0 ;i--){ int u=(x>>i)&1 ; if (son[p][u]==0 ){ son[p][u]=++idx; } p=son[p][u]; } } public static int query (int x) { int p=0 ,res=0 ; for (int i=30 ;i>=0 ;i--){ int u=(x>>i)&1 ; int flag; if (u==1 ) flag=0 ; else flag=1 ; if (son[p][flag]!=0 ){ p=son[p][flag]; res=res*2 +flag; } else { p=son[p][u]; res=res*2 +u; } } return res; } }
3.哈希表与 Set
3.1 模拟散列表 #include <bits/stdc++.h> using namespace std; const int N=3e5+10; const int MAX=0x3f3f3f3f; int h[N]; int n; int find(int x){ int t=(x%N+N)%N;
import java.util.*; public class Main { public static final int MAX=0x3f3f3f3f ; public static final int N= (int ) (3e5 +10 ); public static int []h=new int [N]; public static int n; public static void main (String[] args) { Scanner sc = new Scanner (System.in); Arrays.fill(h,MAX); n=sc.nextInt(); for (int i=0 ;i<n;i++){ char op=sc.next().charAt(0 ); int x=sc.nextInt(); if (op=='I' ){ h[find(x)]=x; } else { if (h[find(x)]!=MAX) System.out.println("Yes" ); else System.out.println("No" ); } } } public static int find (int x) { int t=(x%N+N)%N; while (h[t]!=MAX && h[t]!=x){ t++; if (t==N) t=0 ; } return t; } }
3.2 字符串哈希 #include <bits/stdc++.h> using namespace std; const int N=1e5+10; typedef long long ll; int n,m; ll P=131; ll p[N]; ll h[N]; ll get(int l,int r){ return h[r]-h[l-1]*p[r-l+1]; } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>m; string s; cin>>s; p[0]=1; for(int i=1;i<=n;i++){ p[i]=p[i-1]*P; h[i]=h[i-1]*P+s[i-1]; } for(int i=0;i<m;i++){ int l1,r1,l2,r2; cin> >l1>>r1>>l2>>r2; if (get(l1,r1)==get(l2,r2)){ cout<<"Yes" <<endl; } else { cout<<"No" <<endl; } } return 0; }
import java.util.*; public class Main { public static final int N= (int ) (1e5 +10 ); public static int n,m; public static long P=131L ; public static long [] p=new long [N]; public static long [] h=new long [N]; public static void main (String[] args) { Scanner sc = new Scanner (System.in); n=sc.nextInt(); m=sc.nextInt(); String s=sc.next(); p[0 ]=1 ; for (int i=1 ;i<=n;i++){ p[i]=p[i-1 ]*P; h[i]=h[i-1 ]*P+s.charAt(i-1 ); } for (int i=0 ;i<m;i++){ int l1=sc.nextInt(); int r1=sc.nextInt(); int l2=sc.nextInt(); int r2=sc.nextInt(); if (get(l1,r1)==get(l2,r2)){ System.out.println("Yes" ); } else { System.out.println("No" ); } } } public static long get (int l,int r) { return h[r]-h[l-1 ]*p[r-l+1 ]; } }
3.3 有效的字母异位词 class Solution { public : bool isAnagram (string s, string t) { int hash1[26 ]; int hash2[26 ]; for (int i=0 ;i<s.size ();i++) hash1[s[i]-'a' ]++; for (int i=0 ;i<t.size ();i++) hash2[t[i]-'a' ]++; for (int i=0 ;i<=25 ;i++){ if (hash1[i]!=hash2[i]) return false ; } return true ; } };
3.4 赎金信 class Solution { public : bool canConstruct (string s, string t) { int hash1[26 ]; int hash2[26 ]; for (int i=0 ;i<s.size ();i++) hash1[s[i]-'a' ]++; for (int i=0 ;i<t.size ();i++) hash2[t[i]-'a' ]++; for (int i=0 ;i<=25 ;i++){ if (hash1[i]>hash2[i]) return false ; } return true ; } };
3.5 两个数组的交集 class Solution { public : vector<int > intersection (vector<int >& nums1, vector<int >& nums2) { set<int > set1,set2; for (int i=0 ;i<nums1. size ();i++) set1. insert (nums1[i]); for (int i=0 ;i<nums2. size ();i++){ if (set1. contains (nums2[i])){ set2. insert (nums2[i]); } } return vector <int >(set2. begin (),set2. end ()); } };
class Solution { public int [] intersection(int [] nums1, int [] nums2) {
3.6 快乐数 class Solution { public : int getSum (int n) { int sum=0 ; while (n>0 ){ int t=n%10 ; sum+=t*t; n/=10 ; } return sum; } bool isHappy (int n) { set<int > set; while (true ){ int sum=getSum (n); if (sum==1 ) return true ; if (set.contains (sum)) return false ; set.insert (sum); n=sum; } } };
class Solution { public boolean isHappy (int n) { Set<Integer> set=new TreeSet <>(); while (true ){ int sum=getSum(n); if (sum==1 ) return true ; if (set.contains(sum)) return false ; set.add(sum); n=sum; } } public static int getSum (int n) { int sum=0 ; while (n>0 ){ int t=n%10 ; sum+=t*t; n/=10 ; } return sum; } }
3.7 最长连续序列 class Solution { public : int longestConsecutive (vector<int >& nums) { unordered_set<int > set;
class Solution { public int longestConsecutive (int [] nums) {
3.8 两数之和 class Solution { public : vector<int > twoSum (vector<int >& nums, int target) { unordered_map<int ,int > map; for (int i=0 ;i<nums.size ();i++){ if (map.count (target-nums[i])){ return {i,map[target-nums[i]]}; }else { map[nums[i]]=i; } } return {}; } };
class Solution { public int [] twoSum(int [] nums, int target) { HashMap<Integer,Integer> map=new HashMap <>(); for (int i=0 ;i<nums.length;i++){ if (map.containsKey(target-nums[i])){ return new int []{i,map.get(target-nums[i])}; }else { map.put(nums[i],i); } } return new int []{}; } }
3.9 四数相加 2 class Solution { public : int fourSumCount (vector<int >& nums1, vector<int >& nums2, vector<int >& nums3, vector<int >& nums4) { unordered_map<int ,int > map; for (int a:nums1){ for (int b:nums2){ int s=a+b; map[s]++; } } int cnt=0 ; for (int c:nums3){ for (int d:nums4){ int s=-(c+d); if (map.count (s)){ cnt+=map[s]; } } } return cnt; } };
class Solution { public int fourSumCount (int [] nums1, int [] nums2, int [] nums3, int [] nums4) { HashMap<Integer,Integer> map=new HashMap <>(); for (int i=0 ;i<nums1.length;i++){ for (int j=0 ;j<nums2.length;j++){ int s=nums1[i]+nums2[j]; map.put(s,map.getOrDefault(s,0 )+1 ); } } int cnt=0 ; for (int i=0 ;i<nums3.length;i++){ for (int j=0 ;j<nums4.length;j++){ int s=-(nums3[i]+nums4[j]); if (map.containsKey(s)){ cnt+=map.get(s); } } } return cnt; } }
3.10 字母异位词分组 class Solution { public : vector<vector<string>> groupAnagrams (vector<string>& strs) { vector<vector<string>> res; unordered_map<string,vector<string>> map; for (string s:strs){ string key=s; sort (key.begin (),key.end ());
class Solution { public List<List<String>> groupAnagrams (String[] strs) { Map<String,List<String>> map=new HashMap <>(); for (String s:strs){ char []ch=s.toCharArray(); Arrays.sort(ch); String key=new String (ch); map.computeIfAbsent(key,k->new ArrayList <>()).add(s); } return new ArrayList <>(map.values()); } }
3.11 找出字符串中所有字母异位词 class Solution { public : vector<int > findAnagrams (string s, string p) { vector<int > res; int h[27 ]; int w[27 ]; int n=s.size (); int m=p.size (); if (m>n) return res; for (int i=0 ;i<m;i++) h[p[i]-'a' ]++; for (int i=0 ;i<n;i++){ w[s[i]-'a' ]++; if (i>=m) w[s[i-m]-'a' ]--; if (i>=m-1 && fun (h,w)) res.push_back (i-m+1 ); } return res; } bool fun (int h[],int w[]) { for (int i=0 ;i<=25 ;i++){ if (h[i]!=w[i]) return false ; } return true ; } };
class Solution { public List<Integer> findAnagrams (String s, String p) { List<Integer> res=new ArrayList <>(); int []h=new int [27 ]; int []w=new int [27 ]; int n=s.length(); int m=p.length(); if (n<m) return res; for (int i=0 ;i<m;i++){ h[p.charAt(i)-'a' ]++; } for (int i=0 ;i<n;i++){ w[s.charAt(i)-'a' ]++; if (i>=m) w[s.charAt(i-m)-'a' ]--; if (i>=m-1 && fun(h,w)) res.add(i-m+1 ); } return res; } public static boolean fun (int []h,int [] w) { for (int i=0 ;i<=25 ;i++){ if (h[i]!=w[i]) return false ; } return true ; } }
4.数论
4.1 质数
4.1.1 试除法求质数 #include <bits/stdc++.h> using namespace std; const int N=110; int n; int arr[N]; bool isPrimer(int x){ if (x<=1) return false; for(int i=2;i<=x/i;i++){ if(x%i==0) return false; } return true; } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin> >n; for(int i=0;i<n;i++) cin> >arr[i]; for(int i=0;i<n;i++){ if (isPrimer(arr[i])) cout<<"Yes" <<endl; else cout<<"No" <<endl; } return 0; }
import java.util.*; public class Main { public static final int N=110 ; public static int n; public static int [] arr=new int [N]; public static void main (String[] args) { Scanner sc = new Scanner (System.in); n=sc.nextInt(); for (int i=0 ;i<n;i++) arr[i]=sc.nextInt(); for (int i=0 ;i<n;i++){ if (isPrimer(arr[i])) System.out.println("Yes" ); else System.out.println("No" ); } } public static boolean isPrimer (int x) { if (x<=1 ) return false ; for (int i=2 ;i<=x/i;i++){ if (x%i==0 ) return false ; } return true ; } }
4.1.2 分解质因数 #include <bits/stdc++.h> using namespace std;
import java.util.*; public class Main { public static final int N=110 ; public static int n; public static int []arr=new int [N]; public static void main (String[] args) { Scanner sc = new Scanner (System.in); n=sc.nextInt(); for (int i=0 ;i<n;i++){ arr[i]=sc.nextInt(); } for (int i=0 ;i<n;i++){ fun(arr[i]); } } public static void fun (int x) { for (int i=2 ;i<=x/i;i++){ if (x%i==0 ){ int s=0 ; while (x%i==0 ){ x/=i; s++; } System.out.println(i+" " +s); } } if (x>1 ) System.out.println(x+" " +1 ); System.out.println(); } }
4.1.3 筛质数 #include <bits/stdc++.h> using namespace std;
import java.util.*; public class Main { public static final int N= (int ) (1e6 +10 ); public static int n; public static int cnt; public static int []primes=new int [N]; public static boolean []status=new boolean [N]; public static void main (String[] args) { Scanner sc = new Scanner (System.in); n=sc.nextInt(); for (int i=2 ;i<=n;i++){
4.2 约数
4.2.1 试除法求约数 #include <bits/stdc++.h> using namespace std;
import java.util.*; public class Main { public static int n; public static void main (String[] args) { Scanner sc = new Scanner (System.in); n=sc.nextInt(); for (int i=0 ;i<n;i++){ int x=sc.nextInt(); ArrayList<Integer> res=fun(x); for (int r:res){ System.out.print(r+" " ); } System.out.println(); } } private static ArrayList<Integer> fun (int x) { ArrayList<Integer> res=new ArrayList <>(); for (int i=1 ;i<=x/i;i++){ if (x%i==0 ){ res.add(i); if (i!=x/i){ res.add(x/i); } } } Collections.sort(res); return res; } }
4.2.2 最大公约数 #include <bits/stdc++.h> using namespace std; int n;
import java.util.*; public class Main { public static void main (String[] args) { Scanner sc = new Scanner (System.in); int n=sc.nextInt(); for (int i=0 ;i<n;i++){ int a=sc.nextInt(); int b=sc.nextInt(); System.out.println(gcd(a,b)); } } private static int gcd (int a, int b) { return b!=0 ?gcd(b,a%b):a; } }
4.3 快速幂
4.3.1 模板 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll qmi(ll a,ll b,ll p){ ll res=1%p; while (b!=0){ if ((b&1)!=0){ res=res*a%p; } a=a*a%p; b>>=1; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int n; cin>>n; for(int i=0;i<n;i++){ int a,b,p; cin> >a>>b>>p; ll res=qmi(a,b,p); cout<<res<<endl; } return 0; }
import java.util.*; public class Main { public static void main (String[] args) { Scanner sc = new Scanner (System.in); int n=sc.nextInt(); for (int i=0 ;i<n;i++){ int a=sc.nextInt(); int b=sc.nextInt(); int p=sc.nextInt(); System.out.println(qmi(a,b,p)); } } private static long qmi (long a, long b, long p) { long res=1 %p; while (b!=0 ){ if ((b&1 )!=0 ){ res=res*a%p; } a=a*a%p; b>>=1 ; } return res; } }
4.3.2 快速幂求逆元 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll qmi(ll a,ll b,ll p){ ll res=1%p; while (b!=0){ if ((b&1)!=0){ res=res*a%p; } a=a*a%p; b>>=1; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int n; cin>>n; for(int i=0;i<n;i++){ int a,p; cin> >a>>p; if (a%p==0){ cout<<"impossible" <<endl; }else { cout<<qmi(a,p-2,p)<<endl; } } return 0; }
4.4 求组合数 #include <bits/stdc++.h> using namespace std; const int MOD=1e9+7; const int N=2020; int n; int arr[N][N]; void init(){ for(int i=0;i<N;i++){ for(int j=0;j<=i;j++){ if(j==0) arr[i][j]=1; else arr[i][j]=(arr[i-1][j]+arr[i-1][j-1])%MOD; } } } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); init(); cin> >n; for(int i=0;i<n;i++){ int a,b; cin> >a>>b; cout<<arr[a][b]<<endl; } return 0; }
import java.util.*; public class Main { public static final int MOD= (int ) (1e9 +7 ); public static int N=2010 ; public static int n; public static int [][]arr=new int [N][N]; public static void main (String[] args) { Scanner sc = new Scanner (System.in); init(); n=sc.nextInt(); for (int i = 0 ; i < n; i++) { int a=sc.nextInt(); int b=sc.nextInt(); System.out.println(arr[a][b]); } } public static void init () { for (int i=0 ;i<N;i++){ for (int j=0 ;j<=i;j++){ if (j==0 ) arr[i][j]=1 ; else arr[i][j]=(arr[i-1 ][j]+arr[i-1 ][j-1 ])%MOD; } } } }
4.5 博弈论
4.5.1 Nim 博弈 #include <bits/stdc++.h> using namespace std;
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online