![](https://img-blog.csdnimg.cn/2021081621371246.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
第四讲 数学知识
包括质数,约数,欧拉函数,快速幂,扩展欧几里得算法,中国剩余定理,高斯消元,求组合数,容斥原理,博弈论等内容。
falldeep
远和近
展开
-
求组合数(不同类型的组合数C++)
给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cba mod(109+7)的值。输入格式第一行包含整数 n。接下来 n 行,每行包含一组 a 和 b。输出格式共 n 行,每行输出一个询问的解。数据范围1≤n≤10000,1≤b≤a≤20003101。原创 2022-09-30 22:01:55 · 1235 阅读 · 0 评论 -
试除法求约数(C++)
题目给定n个正整数ai,对于每个整数ai,请你按照从小到大的顺序输出它的所有约数。输入格式第一行包含整数n。接下来n行,每行包含一个整数ai。输出格式输出共n行,其中第i行输出第i个整数ai的所有约数。数据范围1≤n≤100,2≤ai≤2×109输入样例:268输出样例:1 2 3 6 1 2 4 8 代码#include<iostream>#include<vector>#i...原创 2021-08-16 21:47:08 · 25021 阅读 · 1 评论 -
高斯消元解异或线性方程组
题目输入一个包含n个方程n个未知数的异或线性方程组。方程组中的系数和常数为0或1,每个未知数的取值也为0或1。求解这个方程组。异或线性方程组示例如下:M[1][1]x[1] ^ M[1][2]x[2] ^ … ^ M[1][n]x[n] = B[1]M[2][1]x[1] ^ M[2][2]x[2] ^ … ^ M[2][n]x[n] = B[2]…M[n][1]x[1] ^ M[n][2]x[2] ^ … ^ M[n][n]x[n] = B[n]其中...原创 2021-07-26 18:43:00 · 337 阅读 · 0 评论 -
扩展欧几里得算法(C++)
题目给定nn对正整数ai,bi,对于每对数,求出一组xi,yi,使其满足ai×xi+bi×yi=gcd(ai,bi)。输入格式第一行包含整数n。接下来n行,每行包含两个整数ai,bi。输出格式输出共n行,对于每组ai,bi,求出一组满足条件的xi,yi,每组结果占一行。本题答案不唯一,输出任意满足条件的xi,yi 均可。数据范围1≤n≤105,1≤ai,bi≤2×109输入样例:24 68 18输出样例:-1 1-...原创 2021-07-24 09:33:12 · 388 阅读 · 0 评论 -
筛法求欧拉函数(C++)
题目给定一个正整数n,求 1∼n中每个数的欧拉函数之和。输入格式共一行,包含一个整数n。输出格式共一行,包含一个整数,表示 1∼n中每个数的欧拉函数之和。数据范围1≤n≤106输入样例:6输出样例:12代码#include<iostream>using namespace std;const int N = 1e6 + 10;typedef long long LL;int primes[N], cnt;int...原创 2021-07-22 22:18:17 · 418 阅读 · 1 评论 -
快速幂(C++)
题目代码#include<iostream>using namespace std;typedef long long LL;int qmi(int a, int b, int p){ int res = 1; while(b) { if(b & 1) res = (LL) res * a % p; b >>= 1; a = (LL) a * a % p; } return res;}int main(){ int原创 2021-07-23 20:53:38 · 247 阅读 · 0 评论 -
最大公约数(C++)
题目给定n对正整数 ai,bi,请你求出每对数的最大公约数。输入格式第一行包含整数n。接下来n行,每行包含一个整数对 ai,bi。输出格式输出共n行,每行输出一个整数对的最大公约数。数据范围1≤n≤105,1≤ai,bi≤2×109输入样例:23 64 6输出样例:32思想核心:d能整除a d能整除b -> d能整除ax + by代码#include<iostream>using n...原创 2021-07-22 10:50:22 · 280 阅读 · 0 评论 -
快速幂求逆元(C++)
题目输入样例:34 38 56 3输出样例:12impossible代码#include<iostream>using namespace std;typedef long long LL;int qmi(int a, int b, int p){ int res = 1; while(b) { if(b & 1) res = (LL) res * a % p; b >>= 1; a = (L.原创 2021-07-23 21:26:13 · 328 阅读 · 0 评论 -
试除法判定质数(C++)
题目给定n个正整数ai,判定每个数是否是质数。输入格式第一行包含整数n。接下来n行,每行包含一个正整数ai。输出格式共n行,其中第i行输出第i个正整数ai是否为质数,是则输出Yes,否则输出No。数据范围1≤n≤100,1≤ai≤231−1输入样例:226输出样例:YesNo代码#include<iostream>using namespace std;bool is_prime(i...原创 2021-07-20 18:43:53 · 230 阅读 · 0 评论 -
求组合数1
DP,c(a b)可以看作是从a个苹果中选取b个苹果,若首先选择选择一个苹果,则组合数可拆分为两种情况包含该苹果或不包含该苹果,刚好涵盖了所有情况。原创 2021-07-26 21:12:39 · 85 阅读 · 0 评论 -
表达整数的奇怪方式(中国剩余定理C++)
题目给定2n 个整数 a1,a2,…,an和 m1,m2,…,mn,求一个最小的非负整数x,满足∀i∈[1,n],x≡mi(modai)。输入格式第1行包含整数n。第2…n+1 行:每i+1行包含两个整数ai和mi,数之间用空格隔开。输出格式输出最小非负整数 x,如果x不存在,则输出−1。如果存在x,则数据保证x一定在 64位整数范围内。数据范围1≤ai≤231−1,0≤mi<ai1≤n≤25输入样例:28 7...原创 2021-07-25 14:15:00 · 256 阅读 · 0 评论 -
线性同余方程(C++)
题目给定n组数据ai,bi,mi,对于每组数求出一个xi,使其满足ai×xi≡bi(modmi),如果无解则输出impossible。输入格式第一行包含整数n。接下来n行,每行包含一组数据ai,bi,mi。输出格式输出共n行,每组数据输出一个整数表示一个满足条件的xi,如果无解则输出impossible。每组数据结果占一行,结果可能不唯一,输出任意一个满足条件的结果均可。输出答案必须在int范围之内。数据范围1≤n≤105,1≤ai,...原创 2021-07-24 09:52:26 · 1090 阅读 · 0 评论 -
约数之和(C++)
题目给定n个正整数ai,请你输出这些数的乘积的约数之和,答案对 109+7取模。输入格式第一行包含整数n。接下来n行,每行包含一个整数ai。输出格式输出一个整数,表示所给正整数的乘积的约数之和,答案需对 109+7取模。数据范围1≤n≤100,1≤ai≤2×109输入样例:3268输出样例:252代码#include<iostream>#include<unordered_map>#incl...原创 2021-07-22 10:30:57 · 2746 阅读 · 0 评论 -
高斯消元解线性方程组
题目输入一个包含n个方程n个未知数的线性方程组。方程组中的系数为实数。求解这个方程组。下图为一个包含m个方程n个未知数的线性方程组示例:输入格式第一行包含整数n。接下来n行,每行包含n+1个实数,表示一个方程的n个系数以及等号右侧的常数。输出格式如果给定线性方程组存在唯一解,则输出共n行,其中第i行输出第i个未知数的解,结果保留两位小数。如果给定线性方程组存在无数解,则输出Infinite group solutions...原创 2021-07-26 15:16:24 · 247 阅读 · 0 评论 -
欧拉函数(C++)
题目给定n个正整数ai,请你求出每个数的欧拉函数。欧拉函数的定义输入格式第一行包含整数n。接下来n行,每行包含一个正整数ai。输出格式输出共n行,每行输出一个正整数ai的欧拉函数。数据范围1≤n≤100,1≤ai≤2×109输入样例:3368输出样例:224代码#include<iostream>using namespace std;int main(){ int n;...原创 2021-07-22 21:21:13 · 389 阅读 · 0 评论 -
求组合数3
这个数据范围,a,b都是暴大的,所以利用lucass定理进行拆分。原创 2021-07-27 11:46:57 · 604 阅读 · 0 评论 -
约数个数(C++)
题目给定n个正整数ai,请你输出这些数的乘积的约数个数,答案对109+7 取模。输入格式第一行包含整数n。接下来n行,每行包含一个整数ai。输出格式输出一个整数,表示所给正整数的乘积的约数个数,答案需对109+7取模。数据范围1≤n≤100,1≤ai≤2×109输入样例:3268输出样例:12代码#include<iostream>#include<unordered_map>#inclu...原创 2021-07-22 09:38:53 · 2247 阅读 · 0 评论 -
筛质数(埃式筛法和线性筛法)
题目给定一个正整数n,请你求出 1∼n中质数的个数。输入格式共一行,包含整数n。输出格式共一行,包含一个整数,表示1∼n 中质数的个数。数据范围1≤n≤106输入样例:8输出样例:4代码 埃式筛法#include<iostream>using namespace std;const int N = 1e6 + 10;int cnt;bool st[N];int prime[N];void g...原创 2021-07-20 21:20:18 · 103 阅读 · 1 评论 -
求组合数2(C++)
a,b数据也较大,先预处理出各个数的阶乘,然后再模拟手工计算,利用公式算出结果。由于结果中有除法,且为大数,可能会有溢出,因此这里用了逆元,逆元可以用快速幂来算。原创 2021-07-26 22:05:35 · 212 阅读 · 0 评论 -
分解质因数(C++)
题目给定n个正整数ai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。输入格式第一行包含整数n。接下来n行,每行包含一个正整数ai。输出格式对于每个正整数ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。每个正整数的质因数全部输出完毕后,输出一个空行。数据范围1≤n≤100,1≤ai≤2×109输入样例:268输出样例:2 13 12 3代码#i...原创 2021-07-20 19:11:28 · 3197 阅读 · 0 评论 -
拆分——nim游戏
给定 n 堆石子,两位玩家轮流操作,每次操作可以取走其中的一堆石子,然后放入两堆的石子(新堆规模可以为 0,且两个新堆的石子总数可以大于取走的那堆石子数),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数 n。第二行包含 n 个整数,其中第 i 个整数表示第 i 堆石子的数量 ai。输出格式如果先手方必胜,则输出Yes。否则,输出No。数据范围1≤n,ai≤10022 3Yes。原创 2021-07-29 10:35:48 · 24745 阅读 · 0 评论 -
集合nim(C++)
给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S。现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合 S,最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数 k,表示数字集合 S 中数字的个数。第二行包含 k 个整数,其中第 i 个整数表示数字集合 S 中的第 i 个数 si。第三行包含整数 n。第四行包含 n 个整数,其中第 i 个整数表示第 i 堆石子的数量 hi。输出格式。原创 2021-07-28 21:21:28 · 25006 阅读 · 0 评论 -
满足条件的01序列(卡特兰数)
给定 n 个 0 和 n 个 1,它们将按照某种顺序排成长度为 2n 的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。输出的答案对 109+7 取模。输入格式共一行,包含整数 n。输出格式共一行,包含一个整数,表示答案。数据范围1≤n≤10535。原创 2021-07-27 17:55:59 · 987 阅读 · 0 评论 -
台阶nim(C++)
现在,有一个 n 级台阶的楼梯,每级台阶上都有若干个石子,其中第 i 级台阶上有 ai 个石子(i≥1)。两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)。已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数 n。第二行包含 n 个整数,其中第 i 个整数表示第 i 级台阶上的石子数 ai。输出格式如果先手方必胜,则输出Yes。否则,输出No。数据范围1≤n≤105,原创 2021-07-28 20:15:56 · 24611 阅读 · 0 评论 -
能被整除的数(容斥原理)
题目给定一个整数n和m个不同的质数p1,p2,…,pm。请你求出 1∼n中能被p1,p2,…,pm 中的至少一个数整除的整数有多少个。输入格式第一行包含整数n和m。第二行包含m个质数。输出格式输出一个整数,表示满足条件的整数的个数。数据范围1≤m≤16,1≤n,pi≤109输入样例:10 22 3输出样例:7思路代码#include<iostream>using namespace s...原创 2021-07-28 14:33:11 · 24063 阅读 · 2 评论 -
Nim游戏(C++)
题目给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数n。第二行包含n个数字,其中第i个数字表示第i堆石子的数量。输出格式如果先手方必胜,则输出Yes。否则,输出No。数据范围1≤n≤105,1≤每堆石子数≤109输入样例:22 3输出样例:Yes思路代码...原创 2021-07-28 19:41:58 · 26360 阅读 · 0 评论 -
求组合数4
这次ab数字都很大,需要用到高精度乘法,为了方便计算,采用一下计算步骤1.分解质因数(Cab),每个质数p的次数等于a中p的次数减去b中p的次数减去(a - b)中p的次数(因为是除法),利用get函数求出次数2.高精度乘法算出。原创 2021-07-27 17:58:44 · 623 阅读 · 0 评论