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.mzph.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;搭建测试环…