有理函数积分
基本方法 凑成能第一类换元积分的式子 例如$\frac{1}{…}$类的部分分式分解有理函数积分适用条件 有理函数积分当被积函数是有理函数(两个多项式的商)时:$\int \frac{Q(x)}{P(x)}\,dx$其中 $P(x)$ 和 $Q(x)$ 都是多项式。 分母可因式分解 部分分式分解是处理有理函数积分的系统方法,特别适用于: 分母可明确因式分解 没有更简单的特殊技巧 需要精确解析表达式 当分母 $Q(x)$ 可以分解为一次因式和不可约二次因式的乘积时: 一次因式:$(x-a)$ 不可约二次因式:$(x^2+px+q)$,其中 $p^2-4q<0$具体分解规则对于一次因式 $(x-a)^k$: 对应部分为: \frac{A_1}{x-a}+\frac{A_2}{(x-a)^2}+···+\frac{A_k}{(x-a)^k}对于二次因式 $(x^2+px+q)^m$:\frac{B_1x+C_1}{x^2+px+q}+\frac{B_2x+C_2}{(x^2+px+q)^2}+···+\frac{B_mx+C_m}{(x^2+px+q)^...
华中农业达大学迎新赛题解与反思
M-终极考验 这题的大致思路是对的,但是最后处理差分时,直接选择了min(i+x,n),这个就不对了,因为我们要的不是二选1,而是只有在满足要求时才处理。所以把min改成if判断就行了,下次需要注意这个逻辑问题。 H-对决 这个题目是纯暴力的搜索题,那么只要一个一个判断就好了,但是此处注意循环范围是$\leq n-4$而不是$<n-4$.最好自己先之上推导一下再提交 B-爱的魔法 这一题一开始的错误原因是没有注意到交换最接近的会导致得到的不是最大的数字,例如1999,交换以后是9199是不对的,所以要倒遍历。建议自己先多造几组数据再提交,包括一些边界情况等等。随机数也不错(较小范围能手推的)
分步积分笔记
核心公式\int u\,dv = uv - \int v\,du选择原则:”反对幂指三”优先级从高到低选择 $u$: 反三角函数($arcsin$,$arccos$, $arctan$等) 对数函数($\ln x$, $log x$等) 幂函数($x^n$, $x^2$, $\sqrt{x}$等) 指数函数($e^x$, $a^x$等) 三角函数($\sin x$, $\cos x$等) 口诀解释:越靠前的类型越优先选为 $u$,越靠后的类型越优先放入 $dv$。 经典类型与解法类型1:幂函数 × 三角函数$\int x^n\cos x\,dx$ 或 $\int x^n\sin x\,dx$ 将三角函数放入 $dv$(如 $\cos x\,dx = d(\sin x)$) 通过 $n$ 次分部积分逐次降幂 类型2:幂函数 × 指数函数$\int x^n e^{ax}\,dx$ 将指数函数放入 $dv$(如 $e^{ax}\,dx = \frac{1}{a}d(e^{ax})$) 逐次降幂至 $x^0$ 类型3:幂函数 × 对数函数$\int x^n \ln x\,d...
异或笔记
一、 异或的基本性质(基石)记住这四条,其他大多可以推导: 归零律:a ⊕ a = 0 恒等律:a ⊕ 0 = a 自反性(交换律与结合律的推论):a ⊕ b ⊕ a = b 交换律与结合律:运算顺序和分组不影响结果。这使得前缀异或成为可能。 二、 前缀异或:子数组问题的利器这是处理子数组异或和查询最核心的技巧,类似于前缀和。 定义:设 pre[i] = a[1] ⊕ a[2] ⊕ ... ⊕ a[i],并约定 pre[0] = 0。 核心公式:a[l] ⊕ a[l+1] ⊕ ... ⊕ a[r] = pre[r] ⊕ pre[l-1] 原理:pre[r] ⊕ pre[l-1] = (前缀到r) ⊕ (前缀到l-1),根据结合律和归零律,相同的部分(前l-1项)抵消,剩下就是区间 [l, r] 的异或和。 应用场景: 快速求任意子数组异或和。 将“子数组异或和为0”的条件转化为 pre[r] == pre[l-1]。这是解题的关键一步! 问题转化为对前缀异或数组 pre 的分析,常结合哈希表(unordered_map)来统计次数、寻找配对。 三、 位运算的独特性...
ACM数字类题目
数字类题目 定义:通常有乘除法,或者时分解质因数之类的 重要观察 $2^{30} >= 10^9$所以一般不需要几个数就能乘到上界,除法的话同理,分解质因数实际上也算乘法。因此这类题目往往可以比较暴力的解决。因为只要枚举这几个位置即可。 重要例题: 1.题目传送门Strange Machine 重要观察:$log_2(10^9)=30$,所以除去全是1的情况,每次除2最多30次循环就结束了,因此可以暴力解决。除了有1的情况,因为n最大为20,所以最多$20*30$每个数据。 2.题目传送门Even Modulo Pair 重要观察,要塞大量数据来导致超时的话是不可能的,因为在30个数内必然能找到。理由:首先如果只有偶数,那么一定有解。(因为严格递增) 当只有奇数时: 因为当$y<2x$时,必然有$y \mod x \ = \ y-x \ = \text{偶数}$,因此要构造较大的数据的话,只能让$y \geq x 2$ 要让$y \mod x \ != \text{偶数}$,那么最小只能构造$y=x*2$那么和上一题就一样了。 3.题目传送门Add ...
计算机18讲题解
小技巧 在网页前面加上read有奇效例如: 1raed:https://www.reach-top.cn.com 这个是阅读器模式,开启以后就能获取里面原先不让复制的内容了 A题 题目描述每个整数都应输出一个各位数字和,并独占一行。 解题思路拿之前上课的程序自然是能解决的,直接一个循环算到底每一位的值是n%10,要取得下一位就n/=10再算就彳亍了但是注意到这节课的标题是函数,那么我们就编写一个递归程序来计算每一位的和边界条件:n<=10递推式子:n %10+solve(n/10) 参考代码 12345678910ll solve(ll n){ if(n<10) return n; return n%10+solve(n/10);}signed main(){ ll T; while(cin>>T) cout<<solve(T)<<endl; return 0;}//此处#define ll long long B题 题目描述给定若干个正整数,请你从这些整数中找到最小值和第二小的值...
模运算性质总结
模运算(Mod)性质总结定义对于任意实数 $( x, y )$,有: x \mod y = x - y \left\lfloor \frac{x}{y} \right\rfloor, \quad y \neq 0模运算(在一些场合使用符号 % 表示)是一个二元运算。$( x \mod y )$ 的值范围如下: 当 $( y > 0 )$ 时:$( 0 \leq x \mod y < y )$ 当 $( y < 0 )$ 时:$( 0 \geq x \mod y > y )$ 当 $( y = 0 )$ 时:为避免除以零,定义 $( x \mod 0 = x )$ 基本运算规则模运算与基本四则运算类似(除法除外): 加法规则:$((a + b) \mod p = (a \mod p + b \mod p) \mod p)$ 减法规则:$((a - b) \mod p = (a \mod p - b \mod p) \mod p)$ 乘法规则:$((a \times b) \mod p = (a \mod p \times b \mod p) \mod ...
算法挑战赛题解
算法挑战赛第二期题解题目 二进制小数的乘积~HC哥哥说这个很困!难! Description HC哥哥今天又突发奇想,它依然定义一个数字为二进制小数,如果它是一个正整数,并且其十进制表示中的所有数字都是0或1。例如,110 是一个二进制小数,而 102 和 787 不是。 现在HC哥哥给定你一个数 n,你被要求判断是否可能将 n 表示为一些(不一定是不同的)二进制小数的乘积。 Input 第一行包含一个整数 t(1≤t≤5⋅10^4)— 测试用例的数量。 每个测试用例的唯一一行包含一个整数 n(1≤n≤10^5)。 Output 对于每个测试用例,如果 n 可以表示为一些二进制小数的乘积,则输出 “YES”(不带引号),否则输出 “NO”(不带引号)。 题目解释 (翻译成人话) 计算把01串强制转换为整数,再相乘得到的数就是合法的数字,其余都是不合法的。那么直接打表就行了,总共1e5个数,打表还是很容易实现的 接下来我们来学习一下该怎么打表 打表 定义 : 计算出所有情况,然后直接判断。 比如问你100以内的数是否是质数,你肯定能直接回答,因为你已...
算法挑战赛题解(11.2)
算法挑战赛题解(11.2)简单版本:题目大意:给定n个区间,判断这些区间能划分出几种不同的区域 性质不同的数字 题目分析:实际上是在讨论每个点被哪几个区包含,在样例中,数据是这样的,我们来分析一下这两个样例 123456789101112131415161718192021Sample Input 1 11 6Sample Output 12Sample Input 240 124 136 1312 13Sample Output 26 样例分析:12345678样例1: 0 1 1 1 1 1 1 0 0 … … 所以是两种区间样例2: 1 2 3 4 5 6 7 8 9 10 11 12 13 … … 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 ...
压行技巧
如何给你的代码压行?如果不会压行,你的代码看起来会是这样的: 12345678910int ml(vector<int> s, int n){ int m = s[0]; for (int i = 0; i <= n; i++) { if (s[i] > m) m = s[i]; } return m;} 整整用了9行!实际上其实根本不需用那么多行:1234567int ml(vector<int> s,int n){ int m=s[0]; for(int i=0;i<=n;i++){ if(s[i]>m)m=s[i]; } return m;} 当然也可以更短:12345int ml(vector<int> s,int n){ int m=s[0]; for(int i=0;i<=n;i++) if(s[i]...