math
_Rikka_
- v -
展开
-
天梯赛 整除光棍 (math)
天梯赛L1-046 整除光棍 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,原创 2021-04-18 18:16:00 · 205 阅读 · 0 评论 -
蓝桥杯 包子凑数(完全背包、裴蜀定理)
思路:根据裴蜀定理,当所有种类的蒸笼包子数的最大公约数不为1时,凑不出的包子数为无限多,因为无论蒸笼怎么组合都必须得是gcd得倍数,gcd不为1一定会有凑不出的。如果能够凑的出的有限,那么到达某个界限后都是凑得出的,这个界限为Ai*Ai=10000,或许会有人问为啥是这个数,这个具体证明我也搞不出,但可以模拟一下你取任意两个互质的数,如6,7,会发现42之后任意一个数都是可以通过6,7组合出来,姑且就当个结论记了八。然后就是对凑不出的数的一个求解,这个可以通过完全背包解决。dp[i] 表示凑出i个包子.原创 2021-04-13 23:59:59 · 1052 阅读 · 0 评论 -
D. The Number of Pairs (裴蜀定理、埃式筛)
题目思路:对于c⋅lcm(a,b)−d⋅gcd(a,b)=x,由裴蜀定理可得想要使该式c,d为整数成立则x=k * gcd(gcd(a,b),lcm(a,b))=ngcd,所以第一个条件得出gcd的是x的因数。且c,d,x都已经明确给出,我们枚举每个x的因数作为gcd时会得出对应的lcm=(dgcd+x)/c,如果lcm不为整数排除。那么现在我们已经花费O(n^(1/2))求出了每个gcd作为x的因子,现在要求的就是每一步中知道了gcd(a,b),lcm(a,b)求出相应的a,b有多少种可能。a,b,原创 2021-03-26 19:10:03 · 402 阅读 · 0 评论 -
C. The Football Season (math、枚举)
题目思路:要找到满足x+y<=nx⋅w+y⋅d=p,->xw+yd+wd-wd=w*(x+d)+d*(y-w)因为w>d,令x1=x+d,y1=y-w,x1+y1<x+y只要x⋅w+y⋅d=p成立,w*(x+d)+d*(y-w)也成立,一旦y>w就可以化为y1=y%w使得x1+y1更小的情况,所以只要枚举y=[0,w-1]的所有情况即可Code:#include<iostream>typedef long long ll;using namesp原创 2021-03-25 21:56:29 · 139 阅读 · 0 评论 -
E1. Square-free division (easy version) (数论、思维)
题目思路:首先贪心的想一想,我让每一段尽可能长,则最后的段数就可能越少。再来看什么时候一个数是平方数,将一个数质因数分解X=a^x1 * b^x2 * c^x3…只要让一个数的x1 x2 x3…xn都为偶数即可那我们只需发现如果有相乘的两个数各自的质因数次方相加全为偶数则会组成一个平方数,就需要切出一段来。但这个记录各自质因数再让每个相加又太麻烦,所以就想出了一个简便的记录方法,只要记录质因数次数为奇数的所有质因数乘积(把为偶数的部分扔掉,偶数部分不会影响判断),如果发现有两个这种乘积相等,则原创 2021-03-18 21:22:26 · 337 阅读 · 0 评论 -
C. Going Home (抽屉原理、范围、暴力)
题目抽屉原理看题目的数据,其中可以发现两个数相加结果最大也只是5e6,根据抽屉原理,只要有5e6+1个数就至少会有两个数相加得到相同的值。那么也就是说只要枚举出来的两个数相加的答案最多有5e6+1个就一定会得到至少两组坐标满足相加相等,直接暴力即可。#include<iostream>using namespace std;typedef long long ll;const int Max = 5e6 + 5;int lst[Max];int ls[Max][2];int m原创 2021-03-16 22:47:43 · 222 阅读 · 2 评论 -
D. GCD of an Array(数论、multiset)
题目对于n个元素的gcd,将每个元素质因数分解,对于一个质数如果每个元素都有其作为因数,那么这个质数p对答案的贡献为p^(所有元素分成质因数相乘中p的最小次方)a1=p1^b1 …* pi^c1* … pm^d1a2=p1^b2 … * pi^c2 *… pm^d2…an=pn ^ bn…*pi ^ cn … pm^dn如质数pi,其对答案贡献为 pi^(min(c1,c2,c3…,cn)),将质因数的贡献相乘即为最终答案。如果某个质因数不是n个元素都有,那么其没有产生贡献。所以我们需要原创 2021-03-11 20:46:47 · 214 阅读 · 0 评论 -
B. Yet Another Meme Problem (math)
题目a * b+a+b=a * 10^n+ba * b+a=a*10^nb+1=10^n故b=9 99 999 9999…都满足情况,答案为a的个数乘1 —B中满足条件的b的数目#include<iostream>#include<cmath>using namespace std;typedef long long ll;const int Max = 1e6 + 5;ll a[Max], b[Max], lst[Max];int main(){ in原创 2021-03-06 01:46:52 · 121 阅读 · 0 评论 -
A. Deadline (不等式、分块整除)
题目分块整除⌈x+d/(x+1)⌉=⌊x+(d+x)/(x+1)⌋=1+⌊x+(d−1)/(x+1)⌋Code:#include<iostream>#include<cmath>using namespace std;typedef long long ll;const int Max = 1e6 + 5; const int Mod = 1e9 + 7;int main(){ int t;cin >> t; while (t--) {原创 2021-03-06 01:36:45 · 121 阅读 · 0 评论 -
D. Santa‘s Bot (概率、逆元)
题目首先每个礼物被抽到的概率不是均等的,是先从n个人里等概率选出一个人,再从k个礼物等概率选出一个礼物,第1个人每个礼物选中概率1/(nk1) 第二人 1/(nk2)。对于一个礼物c产生的贡献= (1/(nki))【其被选中的概率】(num[c]/n)【正确给到孩子的概率】,需要先记录出每个礼物对应几个孩子,即该礼物的数量。把分母用逆元算即可。Code:#include<iostream>#include<algorithm>#include<cmath>原创 2021-03-04 21:59:34 · 221 阅读 · 1 评论 -
D. Divide and Sum (组合数、思维)
添加链接描述对于任意分组可以发现其实差值是一样的,将绝对值拆开,会发现都是后面n个大的-前面n的小的。看例子 a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 (已按大小排序)假设对于第一组 取了前面3个,后面2个,然后其从很小到大排序,后面一组只可能是取前面2个,后面3个,从大到小排序。那么对于第一组的前3个(顺序)与后面一组的前3个(逆序),必然是第一组的前三个都是a,后面一组的前三个都是b,然后对于第一组后两个,和后一组后两个,第一组后两个必然是b,后一组后两个必然是a。将绝对值去掉原创 2021-03-04 13:58:15 · 604 阅读 · 1 评论 -
C. Division (质因数分解)
题目思路:首先如果a%b!=0,那答案直接为a。如果a%b==0,我们只需给a除以一个最小的数让a%b!=0即可。将a b质因数分解a=a1^n1 * a2^n2 * a3^n3 * a4^n4 …an^nnb=b1^n1 * b2^n2 * b3^n3 * b4^n4 …bn^nn可知当a不包含b全部的质因数组成即可使a%b!=0,即假设a1=b1,那么a的n1=b的n1-1可满足条件,只需将b的所有质因数求出,将a相应得质因数变为组成b得该质因数次方-1即可,然后比较得出除以的那个最小的数原创 2021-03-04 13:46:15 · 220 阅读 · 1 评论 -
D. Domino for Young (黑白染色)
题目运用黑白染色,求出的最少颜色的棋子就是答案。因为当把棋盘用黑和白染色后,每放一个格子必然会占掉黑格和白格各一个,看能最多占掉多少个相邻的黑白格。Code:#include<iostream>using namespace std;typedef long long ll;int main(){ int t;cin >> t; ll f = 1, h = 0, b = 0; while (t--) { int n;cin >> n; if原创 2021-03-03 20:02:16 · 166 阅读 · 1 评论 -
C. Floor and Mod (分块整除)
题目a/b=i, a%b=i -> a=i*(b+1),(对于一个b可以配出几个i就可以产生几个贡献)可以知道对于给出的x,y 取任意1<=b<=y,一个b产生的贡献为min(x/(b+1),b-1)当x>=(b+1)(b-1)时对于此时的b的贡献全取b-1当x<(b+1)(b-1)时按x/(b+1)的贡献,此时用整除分块求解另注意下范围,细节见代码Code:#include<iostream>#include<cmath>#def原创 2021-02-18 00:56:05 · 215 阅读 · 0 评论 -
G. Old Floppy Drive (math、二分)
题目思路:失败的情况:n个数全部相加一遍总和<=0,且前缀和的最大数max也比所询问的数x小成功的情况:因为询问的次数较多,用二分查找优化,先创造个二分的递增条件对于能在一个循环就找到符合条件的答案 x<=max(上文提及)模拟一下过程,3 -2 2 -1 5 4 -3 , 前缀和: 3 1 3 2 7 11 8 如果x=7 要用二分找出第一个>=7的数所在位置,可以知道对于3后面的那个1来说前面的3已经小于7了,1比它小也不可能大于所以这个1是无效的,只有出现>3的数原创 2021-02-18 00:18:00 · 486 阅读 · 3 评论 -
D. Pythagorean Triples (math、暴力)
题目题解:因此c=(a*a-1)/2+1我们暴力枚举a,从a=1到(a * a-1)/2+1<=n (C需要<=n)如果满足(a * a-1)%2==0,即b为整数,且c=b+1,C也为整数,符合条件,贡献+1Code:#include<iostream>#include<cmath>#define pii pair<int,int>#define FAST ios::sync_with_stdio(false),cin.tie(0),cou原创 2021-02-16 01:00:07 · 2901 阅读 · 3 评论 -
D. Radio Towers(dp、逆元)
题目思路:状态方程dp[i]代表从1–n都被照亮的方法数。dp[i]=dp[i-1]+dp[i-3]+dp[i-5]+dp[i-7]…可以看一个例子i=5,假设0表示没照亮1表示照亮dp[5] 1到5都亮可以由以下状态转变而来dp[4] 11110 在i=5处放亮度为1的灯dp[2] 11000 在i=4处放亮度为2的灯dp[0] 00000 在i=3处放亮度为3的灯故dp[5]=dp[4]+dp[2]+dp[0]再如dp[6]=dp[5]+dp[3]+dp[1]所以我们原创 2021-02-11 00:29:08 · 230 阅读 · 0 评论 -
D - Two Divisors (素数筛)
题目首先:对于gcd有gcd(a,b)=gcd(a+b,b)且若gcd(a,b)=1,则gcd(a,c)=gcd(a,c*b)=gcd(a,c * b^n)现有gcd(d1,d2)=1,->gcd(d1+d2,d1)=1,gcd(d1+d2,d2)=1->gcd(d1+d2,d1 * d2)=1,->gcd(d1+d2,d1^n * d2^n)现在再来看题目要我们求什么,我们只需找到ai的两个互质因数d1,d2 , ai=d1^ n * d2可得gcd(d1,d2)=1,由原创 2021-02-08 00:41:36 · 342 阅读 · 0 评论 -
1475E Advertising Agency(组合数)
题目思路:选出K个博主,要使得总共关注者最大,先看一个简单例子如1 2 2 3 4 4 4 4 5 6 7 7 k=6最大为4+4+5+6+7+7=33.可以知道我们一定要选最大的后面6个博主 4 4 5 6 7 7 假设换了前面一个必然导致和不为最大值,而这六个博主其实5 6 7 7也已经定死了,能选择的只有4(第n-k+1个博主的值)我们只需从总共的4个拥有4个关注者的博主选两个答案为C 4 2=4*3/2=6。再推广到普遍情况设第K大博主关注者数量为t,答案为:所有关注者数量为t的博主中选出原创 2021-01-26 01:46:02 · 369 阅读 · 0 评论 -
埃拉托色尼筛法(素数筛)
列举大于等于2的整数,将其倍数划掉,往后遍历发现被划掉的直接略过,还没被划掉的则是质数(表示其不是前面任何一个数的倍数,也即没有除1和本身外的因子)。时间复杂度 O(NloglogN),空间 O(N).Code: int prim[Max], vis[Max], x = 0; //prim[x]第x个质数 void eratos(int n) { for (int i = 2;i <= n;i++) { if (!vis[i])prim[++x] = i; if (vi原创 2021-01-22 13:01:19 · 324 阅读 · 0 评论 -
1263-C Everyone is a Winner! (整除分块)
题目老实说一开始并不知道这题是整除分块,就打表找规律做出来的。想着当一个数15 先除以15/1 = 15 15 /2=7 15/3=5 15/4=3 15/5=3 15/6=2 15/7=2 15/8=2…可以知道除到前面一定只有一个值,到了后面出现出现重复的后从3开始2 1 都会存在且重复。所以把从重复的数比其小的取完,再把前面分散的大的也取完就可以,因为有剪枝不会T掉。最开始的代码:#include<iostream>#include<string>#inc原创 2021-01-16 20:28:22 · 178 阅读 · 0 评论