算法
木一叶liuyue
fighting
展开
-
算法(分组背包 每组物品有若干个,同一组内的物品最多只能选一个。)
有 N 组物品和一个容量是 V 的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。接下来有 N 组数据:每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量;每组数据接下来有 Si 行,每行有两个整数 vij,wij,用空格隔开,分别表示第 i原创 2021-01-10 13:15:47 · 500 阅读 · 0 评论 -
算法(多重背包 第 i 种物品最多有 si 件 大范围与小范围)
多重背包问题 IN的范围比较小有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤1000<vi,wi,原创 2021-01-09 22:20:47 · 255 阅读 · 0 评论 -
算法(贪心-》区间覆盖)
将所有区间按左端点从小到大排序假设有多个区间可以覆盖这个区间,就选择这些区间中右端点最右的那个区间(也就是最长的那个区间)然后将start更新成右端点的最大值给定N个闭区间[ai,bi]以及一个线段区间[s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。输出最少区间数,如果无法完全覆盖则输出-1。输入格式第一行包含两个整数s和t,表示给定线段区间的两个端点。第二行包含整数N,表示给定区间数。接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表原创 2020-11-09 21:59:25 · 141 阅读 · 0 评论 -
算法(贪心->区间分组)
给定N个闭区间[ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。输出最小组数。输入格式第一行包含整数N,表示区间数。接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示最小组数。数据范围1≤N≤105,−109≤ai≤bi≤109输入样例:3-1 12 43 5输出样例:2原题传送门对左端点进行排序priority_queue<int,vector,greater&g原创 2020-11-09 17:05:34 · 215 阅读 · 0 评论 -
算法(贪心-》区间选点,最大不相交区间数量)
给定N个闭区间[ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。输入格式第一行包含整数N,表示区间数。接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示所需的点的最小数量。数据范围1≤N≤105,−109≤ai≤bi≤109输入样例:3-1 12 43 5输出样例:2原题传送门优秀题解传送门将所有区间的右端点进行排序,一般都选择上一个区间的右原创 2020-11-09 12:04:52 · 242 阅读 · 1 评论 -
算法(完全背包 每种物品都有无限件可用)
有 N 种物品和一个容量是 V 的背包,(不同之处)每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000输入样例4原创 2020-11-01 22:01:32 · 633 阅读 · 0 评论 -
算法(背包问题 01背包问题)
二维动态规划#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=1010;int f[N][N]; //表示前i个物品,当前全部体积是j的情况下,总价值是多少int v[N],w[N]; //体积用v价值用w表示int m,n;int main(){ cin>>n>>m; for(int i=原创 2020-10-14 22:34:31 · 266 阅读 · 0 评论 -
算法(spfa求最短路)
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。数据保证不存在负权回路。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出”impossible”。数据范围1≤n,m≤105,图中涉及边长绝对值均不超过10000。输入样例:3 31原创 2020-09-28 21:56:05 · 96 阅读 · 0 评论 -
算法( bellman_ford()->有边数限制的最短路)
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible。注意:图中可能 存在负权回路 。输入格式第一行包含三个整数n,m,k。接下来m行,每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示从1号点到n号点的最多经过k条边的最短距离。如果不存在满足条件的路径,则输出“impossible”。数据范围1≤n,k≤500,1原创 2020-09-27 16:30:39 · 144 阅读 · 0 评论 -
算法(BFS-> Dijkstra求最短路 )
关于本题用到的0x3f代表无穷的讲解0x3f3f3f3f给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出-1。数据范围1≤n≤500,1≤m≤105,图中涉及边长均不超过10000。输入样例:原创 2020-09-26 20:12:58 · 255 阅读 · 0 评论 -
算法(BFS->有向图的拓扑序列)
有向图才会有拓扑序列起点都在终点前面环是找不到任何点入队的一个有向无环图一定至少存在一个入度为0的点给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。输入格式第一行包含两个整数n和m接下来m行,每行包含两个整数x和y,表示存在一条从点x到点y的有向边(x, y)。输出格式共一行,如果原创 2020-09-24 21:14:42 · 435 阅读 · 0 评论 -
算法(DFS->树与图的深度优先遍历->树的重心 )
给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数n,表示树的结点数。接下来n-1行,每行包含两个整数a和b,表示点a和点b之间存在一条边。输出格式输出一个整数m,表示重心的所有的子树中最大的子树的结点数目。数据范围1≤n≤105输入样例91 21 71 42 8原创 2020-09-19 20:48:43 · 81 阅读 · 0 评论 -
算法(bfs-> 树与图的广度优先遍历-> 图中点的层次)
== 深搜是一条道走到黑,宽搜是一层一层的搜宽搜步骤:把1号点插到队列里面去,while(队列不空){取对头元素t,拓展t所有的临点x,若x未被遍历过(因为只有第一次遍历才是最短路径)x入队同时更新x的距离}给定一个n个点m条边的有向图,图中可能存在重边和自环。所有边的长度都是1,点的编号为1~n。请你求出1号点到n号点的最短距离,如果从1号点无法走到n号点,输出-1。输入格式第一行包含两个整数n和m。接下来m行,每行包含两个整数a和b,表示存在一条从a走到b的长度为1的边。原创 2020-09-19 20:46:30 · 107 阅读 · 0 评论 -
算法(BFS-> 八数码)
在一个3×3的网格中,1~8这8个数字和一个“x”恰好不重不漏地分布在这3×3的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把“x”与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让“x”先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 || 1 2 3 || 1 2 3 || 1 2 3x 4 6原创 2020-09-19 15:47:51 · 147 阅读 · 0 评论 -
算法(哈希表---字符串哈希)
给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。输入格式第一行包含整数n和m,表示字符串长度和询问次数。第二行包含一个长度为n的字符串,字符串中只包含大小写英文字母和数字。接下来m行,每行包含四个整数l1,r1,l2,r2,表示一次询问所涉及的两个区间。注意,字符串的位置从1开始编号。输出格式对于每个询问输出一个结果,如果两个字符串子串完全原创 2020-08-29 17:46:59 · 191 阅读 · 0 评论 -
算法(模拟散列表)
时间复杂度:O(1)维护一个集合,支持如下几种操作:“I x”,插入一个数x;“Q x”,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。输出格式对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。每个结果占一行。数据范围1≤N≤105−109≤x≤109输入样例:5I 1I原创 2020-08-28 21:40:04 · 168 阅读 · 0 评论 -
算法(堆----模拟堆)
维护一个集合,初始时集合为空,支持如下几种操作:“I x”,插入一个数x;“PM”,输出当前集合中的最小值;“DM”,删除当前集合中的最小值(数据保证此时的最小值唯一);“D k”,删除第k个插入的数;“C k x”,修改第k个插入的数,将其变为x;现在要进行N次操作,对于所有第2个操作,输出当前集合的最小值。输入格式第一行包含整数N。接下来N行,每行包含一个操作指令,操作指令为”I x”,”PM”,”DM”,”D k”或”C k x”中的一种。输出格式对于每个输出指令“PM”,输出一原创 2020-08-27 18:38:08 · 157 阅读 · 0 评论 -
算法(堆--堆排序)
输入一个长度为n的整数数列,从小到大输出前m小的数。输入格式第一行包含整数n和m。第二行包含n个整数,表示整数数列。输出格式共一行,包含m个整数,表示整数数列中前m小的数。数据范围1≤m≤n≤105,1≤数列中元素≤109输入样例:5 34 5 1 3 2输出样例:1 2 3原题链接#include<iostream>using namespace std;const int N=1e5+10;int h[N],Size;//h=heap,size存的是hea原创 2020-08-27 17:20:13 · 105 阅读 · 0 评论 -
算法(并查集----食物链)
食物链动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是”1 X Y”,表示X和Y是同类。第二种说法是”2 X Y”,表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。1) 当前的话原创 2020-08-27 15:19:55 · 294 阅读 · 0 评论 -
算法(并查集--- 连通块中点的数量)
给定一个包含n个点(编号为1~n)的无向图,初始时图中没有边。现在要进行m个操作,操作共有三种:“C a b”,在点a和点b之间连一条边,a和b可能相等;“Q1 a b”,询问点a和点b是否在同一个连通块中,a和b可能相等;“Q2 a”,询问点a所在连通块中点的数量;**输入格式**第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为“C a b”,“Q1 a b”或“Q2 a”中的一种。输出格式对于每个询问指令”Q1 a b”,如果a和b在同一个连通块中,则输出“Yes”,否则原创 2020-08-27 11:56:51 · 145 阅读 · 0 评论 -
算法(并查集--合并集合)
并查集–合并集合一共有n个数,编号是1~n,最开始每个数各自在一个集合中。现在要进行m个操作,操作共有两种:“M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;“Q a b”,询问编号为a和b的两个数是否在同一个集合中;输入格式第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为“M a b”或“Q a b”中的一种。输出格式对于每个询问指令”Q a b”,都要输出一个结果,如果a和b在同一集合内,则输出“Yes”,否则输出“No”原创 2020-08-27 10:45:55 · 708 阅读 · 0 评论 -
算法(时间复杂度)
原创 2020-08-24 18:09:38 · 84 阅读 · 0 评论 -
算法(最大异或对/Trie应用)
在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?输入格式第一行输入一个整数N。第二行输入N个整数A[1]~A[N]。输出格式输出一个整数表示答案。数据范围1≤N≤10^5,0≤A[i]<2^31输入样例:31 2 3输出样例:3题目链接#include<iostream>using namespace std;const int N=1e5+10,M=3000000;//M=31*N;int a[N];//原数组原创 2020-08-24 18:08:36 · 110 阅读 · 0 评论 -
算法(Trie字符串统计)
Trie:高效的存储和查找字符串集合的数据结构维护一个字符串集合,支持两种操作:“I x”向集合中插入一个字符串x;“Q x”询问一个字符串在集合中出现了多少次。共有N个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数N,表示操作数。接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。输出格式对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。每个结果占一行。数据范围1≤N≤2∗104输入样例:原创 2020-08-24 12:41:13 · 184 阅读 · 0 评论 -
算法(KMP算法)
KMP字符串给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串P在模式串S中多次作为子串出现。求出模板串P在模式串S中所有出现的位置的起始下标。输入格式第一行输入整数N,表示字符串P的长度。第二行输入字符串P。第三行输入整数M,表示字符串S的长度。第四行输入字符串S。输出格式共一行,输出所有出现位置的起始下标(下标从0开始计数),整数之间用空格隔开。数据范围1≤N≤10^51≤M≤10^6输入样例:3aba5ababa输出样例:原创 2020-08-23 18:15:58 · 253 阅读 · 0 评论 -
算法(滑动数组)
给定一个大小为n≤10^6的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。您只能在窗口中看到k个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为[1 3 -1 -3 5 3 6 7],k为3。您的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。输入格式输入包含两行。第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长度。第二行有n个整数,代表数组的具体数值。同行数据之间用空格隔开。输出格式输出包含两个。第一行输出,从左至右,每个位置滑动原创 2020-08-23 16:34:38 · 1120 阅读 · 0 评论 -
算法( 单调栈)
给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。输出格式共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。数据范围1≤N≤10^51≤数列中元素≤10^9输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2#include<iostream>using namespace std;const int N=原创 2020-08-22 21:11:07 · 130 阅读 · 0 评论 -
算法(模拟队列)
实现一个队列,队列初始为空,支持四种操作:(1) “push x” – 向队尾插入一个数x;(2) “pop” – 从队头弹出一个数;(3) “empty” – 判断队列是否为空;(4) “query” – 查询队头元素。现在要对队列进行M个操作,其中的每个操作3和操作4都要输出相应的结果。输入格式第一行包含整数M,表示操作次数。接下来M行,每行包含一个操作命令,操作命令为”push x”,”pop”,”empty”,”query”中的一种。输出格式对于每个”empty”和”query”原创 2020-08-22 18:17:31 · 486 阅读 · 0 评论 -
算法(模拟栈)
用数组模拟栈栈 :先进后出 第一个被输入的数最后被输出队列:先进先出 第一个被输入的数第一个被输出实现一个栈,栈初始为空,支持四种操作:(1) “push x” – 向栈顶插入一个数x;(2) “pop” – 从栈顶弹出一个数;(3) “empty” – 判断栈是否为空;(4) “query” – 查询栈顶元素。现在要对栈进行M个操作,其中的每个操作3和操作4都要输出相应的结果。输入格式第一行包含整数M,表示操作次数。接下来M行,每行包含一个操作命令,操作命令为”push x”,原创 2020-08-22 17:39:36 · 137 阅读 · 0 评论 -
算法(双链表)
实现一个双链表,双链表初始为空,支持5种操作:(1) 在最左侧插入一个数;(2) 在最右侧插入一个数;(3) 将第k个插入的数删除;(4) 在第k个插入的数左侧插入一个数;(5) 在第k个插入的数右侧插入一个数现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。输入格式第一行包含整数M,表示操作次数。原创 2020-08-20 17:27:41 · 426 阅读 · 0 评论 -
算法( 单链表(以数组实现))
用数组模拟链表,速度快 ==相当于静态链表实现一个单链表,链表初始为空,支持三种操作:(1) 向链表头插入一个数;(2) 删除第k个插入的数后面的数;(3) 在第k个插入的数后插入一个数现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。输入格式第一行包含整数M,表示操作次数。接下来M行,每行包含一个原创 2020-08-19 22:13:15 · 359 阅读 · 0 评论 -
算法(BFS走迷宫)
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。输入格式第一行包含两个整数n和m。接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。输出格式输出一个整数,表示从左上角移动至右下角的原创 2020-08-18 17:32:00 · 374 阅读 · 0 评论 -
算法(区间合并)
给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3]和[2,6]可以合并为一个区间[1,6]。输入格式第一行包含整数n。接下来n行,每行包含两个整数 l 和 r。输出格式共一行,包含一个整数,表示合并区间完成后的区间个数。数据范围1≤n≤100000,−10^9 ≤l≤r≤ 10^9输入样例:51 22 45 67 87 9输出样例:3#include<iostream>原创 2020-08-18 11:57:14 · 543 阅读 · 0 评论 -
算法DFS(排列数字//n-皇后问题)
排列数字给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤7输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1#include<iostream>using namespace std;const int N=10;int path[N];//路径bool st[N];//原创 2020-08-17 21:09:52 · 242 阅读 · 0 评论 -
算法(归并排序~求逆序对的数量)
给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数n,表示数列的长度。第二行包含 n 个整数,表示整个数列。输出格式输出一个整数,表示逆序对的个数。数据范围1≤n≤100000输入样例:62 3 4 5 6 1输出样例:5#include<iostream>using namespace原创 2020-08-10 17:27:52 · 438 阅读 · 0 评论 -
算法 博弈论(集合 Nim游戏)
给定n堆石子以及一个由k个不同正整数构成的数字集合S。现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合S,最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数k,表示数字集合S中数字的个数。第二行包含k个整数,其中第i个整数表示数字集合S中的第i个数si。第三行包含整数n。第四行包含n个整数,其中第i个整数表示第i堆石子的数量hi。输出格式如果先手方必胜,则输出“Yes”。否则,输出“No”。数据范围原创 2020-08-08 21:41:19 · 238 阅读 · 0 评论 -
算法 博弈论( 台阶Nim游戏)
现在,有一个n级台阶的楼梯,每级台阶上都有若干个石子,其中第i级台阶上有ai个石子(i≥1)。两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)。已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数n。第二行包含n个整数,其中第i个整数表示第i级台阶上的石子数ai。输出格式如果先手方必胜,则输出“Yes”。否则,输出“No”。数据范围1≤n≤10^5,1≤ai≤10^9输入样例原创 2020-08-08 20:33:25 · 313 阅读 · 0 评论 -
算法 博弈论( 初级Nim游戏)
给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数n。第二行包含n个数字,其中第 i 个数字表示第 i 堆石子的数量。输出格式如果先手方必胜,则输出“Yes”。否则,输出“No”。数据范围1≤n≤10^5,1≤每堆石子数≤10^9输入样例:22 3输出样例:Yes辅助:博弈论入门异或符号是⊕.1⊕1=00⊕0=01⊕0=1原创 2020-08-08 17:45:14 · 430 阅读 · 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 std;typedef long long LL;int p[20];//n最多为16in原创 2020-08-07 22:22:30 · 2095 阅读 · 0 评论 -
算法(组合数/ 满足条件的01序列)
给定n个0和n个1,它们将按照某种顺序排成长度为2n的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中0的个数都不少于1的个数的序列有多少个。输出的答案对10^9+7取模。输出格式共一行,包含整数n。输出格式共一行,包含一个整数,表示答案。数据范围1≤n≤105输入样例:3输出样例:5#include<iostream>using namespace std;const int mod=1e9+7;typedef long long LL;LL qmi原创 2020-08-07 21:20:18 · 534 阅读 · 0 评论