数论
文章平均质量分 51
SundayJerry
这个作者很懒,什么都没留下…
展开
-
收集邮票(概率期望 + dp)
题目链接题意:有 n 种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是 n 种邮票中的哪一种是等概率的,概率均为 1/n。但是由于凡凡也很喜欢邮票,所以皮皮购买第 k 次邮票需要支付 k元钱。现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望解法:显然这是一个概率期望题,是一个等概率事件问题,首先我们需要设出两个数组d[i]表示已经取完了i张票,取完剩下邮票的期望次数,显然d[n] = 0,我们之后需要进行逆推对原创 2021-11-01 23:11:36 · 588 阅读 · 0 评论 -
HDU3292.No more tricks, Mr Nanguo(pell 方程理论 + 矩阵快速幂)
今天刚刚学完pell 方程理论记录一下了证明略,给大家推荐两个证明比较好的博客和学习网站oi-wike-Pell方程这是一个很好的总结博客添加链接描述#include<bits/stdc++.h>#define ll long longusing namespace std;const int N = 2;const int mod = 8191;struct Matrix{ ll a[N][N]; int n,m; Matrix(int b, int原创 2021-10-19 20:08:32 · 89 阅读 · 0 评论 -
D. Omkar and Circle(思维+转移)
题意:给你一个长度为n的环,相邻两个相连,a_1跟a_2相连…a_n跟a_1相连,之后你可以选择一个数a[i],然后选择它相邻的两个数b,c,然后a[i] = b + c,之后将b,c这两个数删除,让我们求操作到最后剩余一个数的最大值解法:给的n为奇数,那么我们可以进行操作(n/2)次最后剩余一个数,考虑之后得到值就是(n + 1)/2数之和,之后发现就是每一次开头向后移两个位置,末尾的数a_(n-1)往a_1移,之后就是这几个和进行取最大即可a0 a2 a4.....an−1a2&原创 2021-09-07 21:37:11 · 173 阅读 · 0 评论 -
D. Minimax Problem(二分+状压)
题意:给你一个n*m的矩阵a,然后定义一个数组b,我们可以在a数组中随机选择两行i,j(1<=i,j<=n,i和j可以相等)对于k∈[1,m]b_k = max(a_i,k,a_j,k),之后我们需要去最大化k∈[1,m],b_k的最小值解法:实际解法我们可以把题意简单化就是要最大化最小值,那么可以考虑二分答案#include<bits/stdc++.h>using namespace std;const int maxn = 3e5 + 5;const int N = 1原创 2021-09-07 21:18:07 · 77 阅读 · 0 评论 -
P3455 [POI2007]ZAP-Queries(莫比乌斯反演)
题目链接给出 a,b,da,b,d,求满足 1≤x≤a,1≤y≤b,且 gcd(x,y)=d 的二元组 (x,y)的数量。解法:莫比乌斯反演~提出k来得到使用莫比乌斯反演得到之后将μ(d)提前得到之后μ(d)与之后的求和公式无关,就可以直接进行求解,对于第一个求和公式的n为min(n/k,m/k)之后就是简单的莫比乌斯筛和简单数论分块就能解决了如果觉得讲的不够详细^ _ ^推荐以下资料https://www.luogu.com.cn/problem/solution/P3455原创 2021-08-23 20:52:08 · 113 阅读 · 0 评论 -
新Nim游戏(线性基+Nim博弈)
原题链接传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游戏者也有这样一次机会。从第三个回合(又轮到第一个游戏者)开始,规则和Nim游戏一样。如果你先拿,怎样才能保证获胜?如果可原创 2021-08-22 17:02:31 · 80 阅读 · 0 评论 -
[SDOI2016]排列计数(组合数+排列)
原题链接题意:给你n个数其中这那个数的范围为1-n,如果第i个数a[i]的值为i则这个数是稳定的,那么当前给出n个数,如果恰好有m个数是稳定的,求满足序列的方案数解法:第一步我们先选择出m个数是稳定的就是C(n,m),那么对于其他的n-m个数我们需要保证是错综排列的,对于这个错综排列的方案定义一个函数d[i],对于d[i]来说,d[i]的递推方程为d[i] = (d[i - 1] + d[i - 2])*(i - 1),那么我们求得答案就是C(n,m) * d[n-m]#include<bits原创 2021-08-22 16:38:22 · 83 阅读 · 0 评论 -
CF1342E. Placing Rooks(容斥+组合数)
原题链接题意:n * n的棋盘有n个车,满足下面的条件1.棋盘上的每一个空格子至少能够被车走直线走到2.恰好存在k辆车互相攻击解法:1.对于第一个条件来说,我们只需要进行考虑行的,对于列的*2即可,对于k=0不考虑。2.首先我们每一个行都能够到了,所以确定了第一个条件,之后我们对于一个列放x对车,那么互相攻击就有x-1对了3.分析完1,2后,我们只需要把点放在n-k列中进行排列组合,对于放在n-k列中,答案总共有(n-k)^n,之后我们需要减去多余情况,利用容斥原理,之后我们减去多余空行为1的原创 2021-08-16 21:24:20 · 105 阅读 · 0 评论 -
CF1119E.Pavel and Triangles(简单贪心+策略)
原题描述题意:给你n种木棍,每种木棍的长度为2(i-1),之后会给出n个数表示长度为2(i-1)有多少根,对于每一根木棍我们只能用一次,我们需要求最多组成多少个三角形。解法:贪心,我们只需要选择当前长度相同的两个木棍,之后我们匹配比它长度小的进行匹配,之后我们在进行匹配当前长度的三个木棍,贪心策略。#include<bits/stdc++.h>#define ll long long #define pii pair<int,int>#define IOS ios::sy原创 2021-08-16 20:52:55 · 78 阅读 · 0 评论 -
CF474F.Ant colony(线段树+策略)
原题链接题意:给你n只蚂蚁,q个询问,对于询问来说,你可以任意选择一个区间[l,r],之后这里的蚂蚁就会相互之间作战,那么当ai和aj决斗时,如果ai能够被aj整除,那么ai的战斗点+1,当且仅当蚂蚁的战斗点为r-l的时候才不用被吃掉,让你求询问的区间,一共吃掉了多少个蚂蚁,样例:[1, 3, 2, 4 ,2]询问区间[1, 5]的时候它们分别的战斗点为[4, 0, 2, 0, 2]解法:一开始想到了区间gcd,但是考虑1的情况时候考虑了很久,之后考虑了如果区间的gcd等于最小值,说明现在最小值能够被原创 2021-08-13 16:11:17 · 98 阅读 · 0 评论 -
2B - The least round way(dp)
原题链接题意:从左上角走到右下角,经过路径的数字相乘得到的答案最少有多少个0解法:我们考虑生成0的有那种方法对于个位来说,我们发现只有2*5=10会产生0,那么我们就可以考虑维护到哪一个位置最少有多少个2和5,那么我们就可以维护一个三维dp,dp(i,j,k),i表示到了多少行,j表示到了多少列,k有0或 1,0表示当前有多少个2,1表示当前的状态有多少个5,特别注意,只要出现了0答案就是1,我们需要进行记录0的位置。之后,我们先跑一边O(n^2)的dp维护出dp(n-1,n-1,0)和dp(n-1原创 2021-08-13 10:19:26 · 91 阅读 · 0 评论 -
1400B - RPG Protagonist(暴力枚举)
原题链接原题题意就是一个主人和一个随从,主人能够拿p重量的重物,随从能够拿f重量的重物,现在有cnts把剑重量为s,cntw把战斧重量为w,那么我们最多可以携带多少把武器解法:我们只需要暴力枚举,然后加一点贪心即可,实际操作代码注释里面有哦!#include<bits/stdc++.h>#define ull unsigned long long#define sc scanf#define pr printf using namespace std;void solve(){原创 2021-08-13 00:30:13 · 136 阅读 · 0 评论 -
CF1305C. Kuroni and Impossible Calculation(暴力枚举)
原题链接题意:给你有n个数的数组,m为模数,让你计算下面的公式值∏1<=i<j<=n∣ai−aj∣(modm)\prod_{1<=i<j<=n}|ai - aj|(mod m)1<=i<j<=n∏∣ai−aj∣(modm)解法:对于这个题目(2 <= n <= 2e5)(1 <= m <= 1000),对于这个题目我们可以知道,对于上面这个公式,在这个1<=i<j<=n范围,|ai-aj|%m = |原创 2021-08-08 10:33:30 · 60 阅读 · 0 评论 -
1342C - Yet Another Counting Problem(暴力枚举)
原题链接题意:给你两个数a和b,q个询问,每个询问包括两个数l,r,对一个数x,l<=x<=r,x满足((x mod a) mod b)≠((x mod b)mod a),计算每一个询问解法:我们可以假设x = k1 * a + c,x = k2 * b + d那么如果((x mod a) mod b)=((x mod b)mod a)成立,c = d,那么x的表达式就可以表示为x = k*lcm(a,b) + e;其中e为max(a,b) - 1#include<bits/st原创 2021-08-07 23:46:24 · 330 阅读 · 0 评论 -
CF1349A. Orac and LCM(策略 + 维护后缀gcd)
题意:给你n个数,给你两种定义一个为gcd,lcm如:gcd({8,12}) =4, gcd({12,18,6})=6,lcm({4,6})=12.1.对于这个n个数我们定义一个集合t={lcm({ai,aj}) | i<j}2.之后我们要进行求解答案gcd({lcm({ai,aj}) | i<j})解法:我们可以把所有i相同的定义为一组,那么gcd({lcm{ai,ai+1…an}})那么对于i=1时gcd1 = gcd(lcm(a1,a2),lcm(a1,a3)…lcm(a1,a.原创 2021-08-07 22:54:53 · 141 阅读 · 0 评论 -
CF1334C. Circle of Monsters(贪心)
原题链接题意:给你n个怪物,每个怪物有ai点血,当怪物死亡以后对下一个怪物产生bi点伤害,每一次你可以开一枪对怪物产生一点伤害,求最小的操作数使得怪物全部死亡。解法:首先我们要想到一个贪心的思想,就是我们打的顺序是需要连续的,不然我们产生的bi伤害就会因此浪费导致答案变大。那么我们就可以枚举第一次打的位置,然后进行计算每一个位置对它之后进行产生的影响```cpp#include<bits/stdc++.h>#define sc scanf#define pr printf#def原创 2021-08-07 21:21:31 · 182 阅读 · 0 评论