010數論——算法備賽

數論

模運算

一般求余都是對正整數的操作,如果對負數,不同編程語言結果可能不同。

C/javapython
a>m,0<=a%m<=m-1 a<m,a%m=a~
5%3==2~
-5%3== -21
(-5)%(-3)== -2~
5%(-3)==2-1
正數:(a+b)%m==((a%m)+(b%m))%m~
正數:(a-b)%m=((a%m)-(b%m))%m~
(a*b)%m=((a%m)*(b%m))%m~
an%m=(a%m)n % m~

C/java:負數求余結果為非正數,正數求余結果為非負數,求余結果的絕對值為兩數絕對值求余的結果

python:若余數m為正數,求余結果范圍[0,m-1],若余數m為負數,求余結果范圍[m+1,0]

乘法取模公式需注意:兩個大數a*b可能溢出。

以下代碼在一定程度上可以解決

typedef long long ll;
ll mul(ll a,ll b,ll m){a%=m;b%=m;ll res=0;while(b>0){  //以空間換時間if(b&1) res=(res+a)%m;a=(a<<1)%m;  //需保證2a不會溢出 a>m;b>>=1;}return res;
}

為了不直接計算 a*b ,改為計算(a*2)*(b/2)

即為求**(a*2)*(b/2)%m ={((a*2)%m )*(b/2)}%m**。每次將(a*2)%m 賦值給a;

連續執行 a*2和b/2

即(a*2*2…*2)*(b/2/2…/2),

直到b減少為1,原式改為求 (a*2*2…*2)%m

當b減少為0時,循環結束,返回目標值res。

當b為偶數時 a*b ==(a*2)*(b/2)

當b為奇數時 a*b ==(a*2)*(b/2)+a 每次將多出來的a求余存進res。

最大公約數

遞歸寫法

int gcd(int a,int b){return b?gcd(b,a%b):a;
}

動態規劃寫法

while(b > 0){int tmp = a % b;a = b;b = tmp;
}
return a;

最小公倍數

int lcm(int a,int b){return a*b/gcd(a,b);
}

快速冪

對于a^n 如果一個一個地乘,計算量為O(n),采用快速冪計算,計算量為O(log2n);

以a^11為例

利用冪次與二進制的關系 a11=a8*a2*a1;

ll fastPow(ll a,ll n){ll ans=1;while(n){if(n&1)  ans*=a;a*=a;  //倍增遞推 a  a^2  a^4  a^8 ...n>>=1;  //右移,把處理過的n的最后一位去掉}return ans;
}

冪運算的結果往往是大數,一般會對其取模處理。更據模的性質,

an%m=(a%m)n % m.

上述代碼修改為

ll fastPow(ll a,ll n,ll m){ll ans=1;a%=m;  //一定程度上能防止溢出。,但做題時仍需謹慎,a不能太大,否則只能用高精度處理。while(n){if(n&1) ans=(ans*a)%m;a=(a*a)%m;n>>=1;}
}

上述代碼依然存在溢出問題。 ans*a a*a可能溢出

計算 a^n%m ,如果n極大 如 n=10^200000000, 可以用“歐拉降冪”的方法。

統計好數字的數目

問題描述

我們稱一個數字字符串是 好數字 當它滿足(下標從 0 開始)偶數 下標處的數字為 偶數奇數 下標處的數字為 質數2357)。

  • 比方說,"2582" 是好數字,因為偶數下標處的數字(28)是偶數且奇數下標處的數字(52)為質數。但 "3245" 不是 好數字,因為 3 在偶數下標處但不是偶數。

給你一個整數 n ,請你返回長度為 n 且為好數字的數字字符串 總數 。由于答案可能會很大,請你將它對 109 + 7 取余后返回

一個 數字字符串 是每一位都由 09 組成的字符串,且可能包含前導 0 。

原題鏈接

代碼

int countGoodNumbers(long long n) {int mod=1e9+7;long long t4=n/2,t5=(n+1)/2;auto pows=[&](long long s,long long t)->long long{  //快速冪long long ans=1;while(t){if(t&1) ans=(ans*s)%mod;s=(s*s)%mod;t>>=1;}return ans;};return (pows(4,t4)*pows(5,t5))%mod;}

字符串表達式運算

基本計算器|

問題描述

給你一個字符串表達式 s ,請你實現一個基本計算器來計算并返回它的值。

注意:不允許使用任何將字符串作為數學表達式計算的內置函數,比如 eval()

提示:

  • 1 <= s.length <= 3 * 105
  • s 由數字、'+''-''('')'、和 ' ' 組成
  • s 表示一個有效的表達式
  • ‘+’ 不能用作一元運算(例如, “+1” 和 "+(2 + 3)" 無效)
  • ‘-’ 可以用作一元運算(即 “-1” 和 "-(2 + 3)" 是有效的)
  • 輸入中不存在兩個連續的操作符
  • 每個數字和運行的計算將適合于一個有符號的 32位 整數

原題鏈接

思路分析

首先考慮如果沒有括號的情況,那就是簡單的加減運算,有了括號問題就變得復雜一點,借助小學的知識去除括號,那問題就變成簡單的加減題。

  • 括號左邊運算符為+,那直接去除,例1+(2+3)——>1+2+3
  • 括號左邊運算符為-,那去除括號后,括號內的運算符全部反轉,例1-(2+3)——>1-2-3

對于嵌套的反轉其實就是反轉后再反轉。

定義oper指示前一個運算符是+(true),還是減-(false)

定義rev指示括號內運算符是否反轉,每遍歷到一個'('就決定是否對rev取反,遍歷到')'就取消決定,這里為應對多重的(),用一個棧來維護前面的決定。

對于oper,rev的值對數值的運算有如下關系:

operrev結果
truetrue-
truefalse+
falsetrue+
falsefalse-

可以看到,oper與rev的共同作用對加還是減運算其實是異或的結果,oper^revtrue,則做加法,oper^revfalse,則做減法。

代碼

int calculate(string s) {int n = s.size();int ans = 0, pre = 0;bool oper = true, rev = false;stack<bool>st;for (int i = 0; i < n; i++) {if (s[i] == ' ') continue;switch (s[i]) {case '+':oper = true;break;case '-':oper = false;break;case '(':st.push(oper);if (!oper) rev = !rev,oper=true;break;case ')':if (!st.top()) rev = !rev;st.pop();break;default:pre=pre*10+(s[i]-'0');if(i==n-1||s[i+1]<'0'||s[i+1]>'9'){if (rev ^ oper) ans += pre;else ans -= pre;pre=0;}}}return ans;
}
基本計算器||

給你一個字符串表達式 s ,請你實現一個基本計算器來計算并返回它的值。

整數除法僅保留整數部分。

你可以假設給定的表達式總是有效的。所有中間結果將在 [-231, 231 - 1] 的范圍內。

**注意:**不允許使用任何將字符串作為數學表達式計算的內置函數,比如 eval()

提示:

  • 1 <= s.length <= 3 * 105
  • s 由整數和算符 ('+', '-', '*', '/') 組成,中間由一些空格隔開
  • s 表示一個 有效表達式
  • 表達式中的所有整數都是非負整數,且在范圍 [0, 231 - 1]
  • 題目數據保證答案是一個 32-bit 整數

原題鏈接

代碼

int calculate(string s) {int ans=0,pre=0,num=0,n=s.size();char preOper='+';bool isAdd=true;for(int i=0;i<=n;i++){if(i<n&&s[i]==' ') continue;if(i<n&&s[i]>='0'&&s[i]<='9'){num=10*num+(s[i]-'0');}else{switch(preOper){case '*':pre*=num;break;case '/': pre/=num;break;case '+':case '-':ans+=isAdd?pre:-pre;pre=num;isAdd=preOper=='+';break;}if(i<n) preOper=s[i];num=0;}}ans+=isAdd?pre:-pre;return ans;}

數位統計

無理數位數查詢

問題描述

在這里插入圖片描述
原題鏈接

思路分析

見注釋。

代碼

#include <bits/stdc++.h>
#define IOSCC ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef unsigned long long ll;
const int N = 1e6 + 10;ll qpow(ll a,ll b){  //快速冪求a的b次方。ll res = 1;while(b){if(b & 1) res = res * a;b >>= 1;a = a * a;}return res;
}void solve() {ll n, m;cin >> n >> m; ll res = 0;ll i, j;for (i = m - 1, j = 1;; i *= m, j++) { //這一步是為了找到在位數為j時可以找到n的位數res += i * j;if (res >= n) {res -= i * j;break;  //直接退出,j不再加1、}}ll offset = n - res;  //得到從位數為j開始時的偏移量ll num = offset / j;  //target為j位數中的第num個。ll digit = offset % j;   //目標數字(數位)為目標數值中的第digit個數字if(digit == 0) num--,digit = j; //如果digit為0的話,說明要找的數是數值的最后一位ll target = qpow(m, j - 1) + num; //得到當前的數字string t1;  //數值可能很大,要用字符串儲存。while (target) {t1 += ('0' + (target % m)); //用字符串存儲m進制數target,從低位到高位target /= m;}reverse(t1.begin(), t1.end()); //翻轉  將數值target用字符串表示出來(從高位到第位)。cout << t1[digit - 1];  //輸出位數,因為字符串從0開始,所以減1
}int main() {IOSCC;int _ = 1;cin >> _;while (_--) {solve();cout << endl;}return 0;
}
統計強大整數的數目

問題描述

給你三個整數 startfinishlimit 。同時給你一個下標從 0 開始的字符串 s ,表示一個 整數。

如果一個 整數 x 末尾部分是 s (換句話說,sx后綴),且 x 中的每個數位至多是 limit ,那么我們稱 x強大的

請你返回區間 [start..finish] 內強大整數的 總數目

如果一個字符串 xy 中某個下標開始(包括 0 ),到下標為 y.length - 1 結束的子字符串,那么我們稱 xy 的一個后綴。比方說,255125 的一個后綴,但不是 512 的后綴。

原題鏈接

代碼

long long numberOfPowerfulInt(long long start, long long finish, int limit, string s) {long long num=0,digs=1;  num為s表示的數值,digs=10^n(n為num的位數)for(int i=0;i<s.size();i++){num=num*10+s[i]-'0';digs*=10;  }auto numbers=[&](long long st)->long long{  //求[0,st]范圍內的強大整數數目long long st_dig=st/digs,st_mod=st%digs,ans=0;long long power=1;int i=0;while(st_dig){int p=st_dig%10;if(p<=limit){ans+=p*power;  //最高位為p時,后面有些值可能取不到,組合總數繼承上一個ans//最高位為[0,p-1]時,后面每位可取[0,limits],組合總數為p*power//總的組合數就是ans+p*power.if(!i&&st_mod>=num) ans++;  //第一位且st_mod>=num時,少算了一個,加上.}else{ans=(limit+1)*power;}st_dig/=10;power*=limit+1; i++;}if(st>=num&&ans==0) return 1;  //未進入循環,但st>=num,可以構成一個強大整數return ans;};return numbers(finish)-numbers(start-1);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77385.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初識Redis · C++客戶端string

目錄 前言&#xff1a; string的API使用 set get&#xff1a; expire: NX XX: mset,mget&#xff1a; getrange setrange: incr decr 前言&#xff1a; 在前文&#xff0c;我們已經學習了Redis的定制化客戶端怎么來的&#xff0c;以及如何配置好Redis定制化客戶端&…

GoogleCodeUtil.java

Google動態驗證碼實現 GoogleCodeUtil.java package zwf;import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.security.SecureRandom;/** https://mvnrepository.com/artifact/commons-codec/…

【Leetcode 每日一題】2176. 統計數組中相等且可以被整除的數對

問題背景 給你一個下標從 0 0 0 開始長度為 n n n 的整數數組 n u m s nums nums 和一個整數 k k k&#xff0c;請你返回滿足 0 ≤ i < j < n 0 \le i < j < n 0≤i<j<n&#xff0c; n u m s [ i ] n u m s [ j ] nums[i] nums[j] nums[i]nums[j] 且…

如何校驗一個字符串是否是可以正確序列化的JSON字符串呢?

方法1&#xff1a;先給一個比較暴力的方法 try {JSONObject o new JSONObject(yourString); } catch (JSONException e) {LOGGER.error("No valid json"); } 方法2&#xff1a; Object json new cn.hutool.json.JSONTokener("[{\"name\":\"t…

【路由交換方向IE認證】BGP選路原則之AS-Path屬性

文章目錄 一、路由器BGP路由的處理過程控制平面和轉發平面選路工具 二、BGP的選路順序選路的前提選路順序 三、AS-Path屬性選路原則AS-Path屬性特性AS-Path管進還是管出呢&#xff1f;使用AS-Path對進本AS的路由進行選路驗證AS-Path不接收帶本AS號的路由 四、BGP鄰居建立配置 一…

2025年熱門項目管理軟件對比:20款工具詳解

本文主要盤點的工具有&#xff1a;1. PingCode; 2. Worktile; 3. Jira; 4. Trello; 5. TAPD; 6. Monday.com; 7. 進度貓; 8. 豬齒魚; 9. 簡道云; 10. Tita項目管理等等20款項目管理軟件&#xff08;含免費&#xff09;。 在如今競爭激烈的商業環境中&#xff0c;項目管理軟件已…

yaffs_write_new_chunk()函數解析

yaffs_write_new_chunk() 是 YAFFS&#xff08;Yet Another Flash File System&#xff09;文件系統中用于將數據寫入新物理塊&#xff08;chunk&#xff09;的關鍵函數。以下是其詳細解析&#xff1a; 函數原型 int yaffs_write_new_chunk(struct yaffs_dev *dev, const u8 *…

網絡安全-Burp Suite基礎篇

聲明 本文主要用做技術分享&#xff0c;所有內容僅供參考。任何使用或者依賴于本文信息所造成的法律后果均與本人無關。請讀者自行判斷風險&#xff0c;并遵循相關法律法規。 1 Burp Suite功能介紹 1.1 Burp Suite 簡介 Burp Suite 是一款極為強大且廣受歡迎的集成化 …

網絡編程 - 2

目錄 UDP 數據報套接字編程 API 介紹 DatagramSocket DatagramPacket 補充&#xff1a; 代碼示例 - 回顯服務器 服務器端&#xff1a; 客戶端&#xff1a; 補充&#xff1a; 代碼演示 梳理代碼&#xff1a; 下面是一個大概的流程圖~ 文字解釋&#xff1a; 圖文并…

【C++深入系列】:模版詳解(上)

&#x1f525; 本文專欄&#xff1a;c &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 你不需要很厲害才能開始&#xff0c;但你需要開始才能很厲害。 ★★★ 本文前置知識&#xff1a; 類和對象&#xff08;上&#xff09; …

java 設計模式之策略模式

簡介 策略模式&#xff1a;策略模式可以定制目標對象的行為&#xff0c;它通過傳入不同的策略實現&#xff0c;來配置目標對象的行為。使用策略模式&#xff0c;就是為了定制目標對象在某個關鍵點的行為。 策略模式中的角色&#xff1a; 上下文類&#xff1a;持有一個策略類…

Perf學習

重要的能解決的問題是這些&#xff1a; perf_events is an event-oriented observability tool, which can help you solve advanced performance and troubleshooting functions. Questions that can be answered include: Why is the kernel on-CPU so much? What code-pa…

「倉頡編程語言」Demo

倉頡編程語言」Demo python 1)# 倉頡語言寫字樓管理系統示例&#xff08;虛構語法&#xff09;# 語法規則&#xff1a;中文關鍵詞 類Python邏輯定義 寫字樓管理系統屬性:租戶庫 列表.新建()報修隊列 列表.新建()費用單價 5 # 元/平方米方法 添加租戶(名稱, 樓層, 面積):…

鎖(Mutex)、信號量(Semaphore)與條件量(Condition Variable)

一、同步機制的核心意義 在多線程/多進程編程中&#xff0c;當多個執行流共享資源&#xff08;如變量、內存、文件&#xff09;時&#xff0c;可能因操作順序不確定導致數據競爭&#xff08;Data Race&#xff09;。同步機制的作用是&#xff1a; 保證原子性&#xff1a;確保…

前端基礎之《Vue(6)—組件基礎(2)》

接上一篇。 七、v-model深入學習 <html> <head><title>組件基礎-4</title><style>.score {display: inline-block;}.score>span {display: inline-block;width: 25px;height: 25px;background: url(./assets/star.png) center center / 25p…

SQL:聚合函數(Aggregate Functions)

目錄 第一性原理出發思考 ——我們為什么需要聚合函數&#xff1f; 什么是聚合函數&#xff1f; 常見聚合函數 實例講解 &#x1f538; 1. COUNT() —— 計數 &#x1f538; 2. MAX() / MIN() —— 最大 / 最小值 &#x1f538; 3. SUM() —— 求和 &#x1f538; 4. …

海關總署廣東:廣東外貿一季度進出口2.14萬億元 同期增長4.2%

大灣區經濟網灣區財經報道&#xff0c;據海關總署廣東分署統計&#xff0c;今年一季度&#xff0c;廣東外貿進出口2.14萬億元&#xff0c;較去年同期&#xff08;下同&#xff09;增長4.2%&#xff0c;增速高于全國2.9個百分點。其中&#xff0c;出口1.34萬億元&#xff0c;增長…

MySQL中高級語法

Mysql高級語法 持續更新中… 1、EXISTS語法 一、基本語法結構 SELECT [列名] FROM [主表] WHERE [條件]AND EXISTS (SELECT 1 -- 子查詢內容無關&#xff0c;僅需占位符&#xff08;如1、*、X等&#xff09;FROM [子查詢表]WHERE [關聯條件] -- 必須與外層查詢關聯&#xf…

SpringBoot 調用deepseek

個人學習心得&#xff0c;僅供參考 軟件環境&#xff1a; JDK 17 你用JDK 11 無法支持SpringBoot 3SpringBoot 3 版本以上才支持spring aimavan 3.6.11.獲取Deepseek官網的API-key 官網&#xff1a;https://platform.deepseek.com/api_keys 2.創建項目 這樣創建 添加依賴…

性能測試面試題的詳細解答

以下是性能測試面試題的詳細解答&#xff1a; 1. 性能測試的流程是怎樣的&#xff1f; 性能測試流程通常包括以下幾個步驟&#xff1a; - **需求分析**&#xff1a;明確測試目標、性能指標&#xff08;如響應時間、吞吐量等&#xff09;。 - **環境搭建**&#xff1a;搭建測試環…