====数学\数论====
「已注销」
这个作者很懒,什么都没留下…
展开
-
hdu 1724 Ellipse (自适应辛普森求积分 模板题)
思路:对于一个一直f(x)表达式的函数,求他的积分。 通过公式: 可以得到一个近似解。然而精度误差很大。所以我们对于每个区间进行递归二分求解。 即:辛普森自适应。(关于为什么是15*eps的问题,可以去知乎看看)#include <iostream>#include <stdio.h>#include <string.h>#include <queue>#include <cmat原创 2017-10-17 19:33:58 · 408 阅读 · 0 评论 -
BZOJ 2190 仪仗队 (莫比乌斯反演)
思路:从 (0,0)(0,0) 开始编号,构造一个n+1阶的矩阵,通过观察我们发现,从(0,0)(0,0) 点看去,点(4,6)(4,6) 一定被点(2,4)(2,4) 挡住了。我们发现,只有当gcd(i,j)==1gcd(i,j)==1 的点,才能被看到,所以,问题转化成了求(1,n)(1,n) 区间内,gcd(i,j)==1gcd(i,j)==1 的无序点对的个数。然后我们需要加上(0,1)(0原创 2017-08-11 20:56:58 · 304 阅读 · 0 评论 -
hdu 4746 Mophues (莫比乌斯反演 + 分块+线性筛)
注意:因为是多组询问(5000)而n又高达5e5,所以我们每次的时间一定要控制在logn或sqrt(n)内才能1s过,分块是必须的了。然后是一个坑点:必须在线性筛里统计数量,自己写函数一个个统计会t在这上。跟csu 1325的思路类似:需要预处理出 F(i)F(i) 的系数,然后求前缀和分块。然而这题p的值会影响某些F(i)F(i) 的系数,所以我们需要将不同的p值的前缀和分别保存下来。注意此题当p原创 2017-08-09 17:06:35 · 370 阅读 · 0 评论 -
BZOJ 2301 Problem b (莫比乌斯反演+区间容斥+分块)
思路:这个题算是bzoj 1695的加强版吧,同样是给你a,b,c,d,k五个数,只不过这次a和c都不一定是1了。那么我们需要进行区间的容斥定理(注意端点值)。同时由于数据量很大,我们还需要分块。容斥: fanyan(b,d)−fanyan(a−1,d)−fanyan(b,c−1)+fanyan(a−1,c−1)fanyan(b,d) - fanyan(a-1,d) - fanyan(b,c-1)原创 2017-08-11 20:22:32 · 237 阅读 · 0 评论 -
BZOJ 2818 Gcd + spoj 4491(莫比乌斯反演 分块)
思路:数据范围1e7,预处理出miu的前缀和,对于每个素数,反演式求 f(i)f(i) 分块,出结果。拓展:如果是多组样例,那么预处理F(i)F(i) 的系数,每次询问是sqrt(n)的复杂度查询。代码在下方。#include<stdio.h>#include <iostream>#include<string.h>#include<math.h>#include<algorithm>#d原创 2017-08-11 20:42:01 · 252 阅读 · 0 评论 -
HDU 6143 Killer Names (容斥/第二类Stirling数)
思路:考虑左边选i个字符组成长度为n的串,那么右边只能从m-i中选1个/2个/3个。。。m-i个数构成长度为n的串。所以问题就转化成了求i个字符(i个字符都出现)构成长度为n的串的个数,设这个为f(x)f(x)。 我们可知 f(i)=in−∑i−1j=1Cji∗f(j)f(i) = i^n - \sum_{j=1}^{i-1} C_i^j * f(j) 式子意思为:从所有的可能中减去只用其中j种原创 2017-08-18 13:08:01 · 288 阅读 · 0 评论 -
BZOJ 2818 Gcd (欧拉筛 \ 莫比乌斯反演)
题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对.(n <= 1e7)思路:考虑每个素数做出的贡献。假设有一个素数p,那么在区间 [1,n/p][1,n/p] 中互质的两个数 x,yx,y ,我们一定有 gcd(xp,yp)=pgcd(xp,yp) = p ,所以我们预处理出1e7的素数和欧拉函数,都用筛法筛出来就好。 对于每个数,他的欧拉函数 phi原创 2017-08-07 11:04:32 · 279 阅读 · 0 评论 -
HDU 6053 TrickGCD (莫比乌斯函数+分块筛)
思路:找到 aia_i 中最小的那个数,枚举他的因数作为gcd,然后根据这个gcd我们可知 ∏ai/gcd\prod a_i/gcd 即为这个这个以这个数为gcd的序列对答案的贡献,然而这么算会有重复。比如我们在算2和3的时候已经把6的序列算了,所以我们需要容斥一下。容斥的方法:莫比乌斯函数。 考虑一个数n,假设他能分解成三个质因数相乘:a*b*c,那么在算gcd为a、b、c时分别算了一遍,所以原创 2017-07-29 10:55:53 · 588 阅读 · 1 评论 -
HDU 6129 Just do it(杨辉三角+lucas \ 记忆化dp)
思路:首先看这么一个图:(此图来自http://blog.csdn.net/qq_37412229/article/details/77231474) 然后我们就能发现每个数对应的系数其实是组合数,然后我们还发现这个杨辉三角跟坐标的对应关系。 设坐标为(x,y),那么对应的组合数为c(x+y-2,y-1)。 所以我们对于每一个奇数的组合数,计算每个a对于其他项的贡献。#include<iost原创 2017-08-16 17:00:20 · 329 阅读 · 0 评论 -
HDU 4549 M斐波那契数列 (矩阵快速幂+费马小定理)
思路:通过列出几项我们就可以发现ab的指数是斐波那契数列。然后博主就开(智)心(障)的用矩阵快速幂算指数了。。 却忘了一件事。。。谁说的取模对指数封闭的啊???md疯狂wa了六七次。 取模对乘法封闭但不意味着指数你可以直接取模啊。。正解是根据费马小定理:ab=cmodpa^b = c \mod p 当 gcd(a,p)=1gcd(a,p) = 1 并且p是素数的时候,有:ap−1=1modpa^原创 2017-08-09 11:00:47 · 257 阅读 · 0 评论 -
HDU 5212 code (莫比乌斯反演)
思路:首先看数据范围1e4就知道不能用n^2的方法。 所以我们要统计每个数作为gcd对答案的贡献。 而统计一个区间内有多少个 gcd(i,j)=kgcd(i,j) = k 的无序数对,当然就是上莫比乌斯喽~ 反演式: 对于这道题,由于是给定的n个数,而不是一个区间,所以我们不能o(1)的求出F(i)的值了,所以先nlogn的预处理出F(i)的的值,然后nlogn的统计出所有f(i)。原创 2017-08-09 10:44:45 · 280 阅读 · 0 评论 -
BZOJ 2005 能量采集(莫比乌斯反演+分块)
思路:跟bzoj 2190那题差不多。 在对gcd(i,j)==kgcd(i,j)==k的贡献做统计是分别对于每个k做统计就ok了,分块这种东西不是顺手就加上了吗。。#include<stdio.h>#include <iostream>#include<string.h>#include<math.h>#include<algorithm>#define eps 1e-8typede原创 2017-08-11 21:05:57 · 170 阅读 · 0 评论 -
SPOJ 7001 Visible Lattice Points (莫比乌斯反演+分块)
思路:跟bzoj 2190差不多,这道题是那个的升级版,这个变成了三维的。 思路一模一样。 算完三维的,记得加上3个剩下的2维的平面上点的贡献就好。#include<stdio.h>#include <iostream>#include<string.h>#include<math.h>#include<algorithm>#define eps 1e-8typedef long l原创 2017-08-11 21:09:47 · 264 阅读 · 0 评论 -
POJ 3219 Binomial Coefficients(组合数 lucas定理)
思路:此题思路类似于这个题,然后我们可以根据这个题的结论得到一个判断方法,n的2进制位上0的位置,对应的一定得是m相应位置的0,否则最后就是0了,所以我们得到了这个式子 (n&m) == m。 http://blog.csdn.net/wing_wuchen/article/details/77170227#include<iostream>#include<cstdio>#include<q原创 2017-08-14 21:33:35 · 315 阅读 · 0 评论 -
HDU 4349 Xiao Ming's Hope(思路 lucas定理)
(图来自http://blog.csdn.net/acdreamers/article/details/8037918) 首先我们知道c(0,0)=1,c(0,1)=0,c(1,1)=1,c(1,0)=1c(0,0)=1,c(0,1)=0,c(1,1)=1,c(1,0)=1 这个是基础。然后对于某个c(n,m)c(n,m) 我们必须让右边的连乘式为1(模2的情况下,因为我们最终要求的也只是看他是原创 2017-08-14 21:25:22 · 427 阅读 · 0 评论 -
HDU 3944 DP?(lucas定理 组合数)
坑点:注意起点和终点也算。 (盗图自http://www.cnblogs.com/simplekinght/p/6986268.html?utm_source=itdadao&utm_medium=referral) 解释一下这个样例2: 根据图中我们的标记,我们得知两种走法,(从终点到起点)先斜上,再上。或者先上,再斜上。 而选择这其中的哪一个呢?依据m的位置而定,如果m>=n/2原创 2017-08-14 20:25:00 · 218 阅读 · 0 评论 -
HDU 1695 GCD (莫比乌斯反演入门学习小结)
前言:这些天在学习莫比乌斯的过程中看了许多博客和众多大牛的解释,然而可是博主太菜的原因,一直没能好好理解,今天偶然间看到了一份吉大附中的ppt,感觉瞬间开了窍,所以先把这个材料推荐给大家,然后我再这里总结一下自己的体会。ppt地址: https://wenku.baidu.com/view/e6645609d15abe23492f4db0.html (以下图片取自ppt,仅供学习与交流使用)上图中原创 2017-08-07 15:46:02 · 455 阅读 · 0 评论 -
FZU 2020 组合(组合数 lucas定理模板题)
思路:m,n很大的组合数,用lucas定理求解。 其中小的 c(x,y)c(x,y) 用乘法逆元暴力求解。因为p是素数,而且我们在用lucas定理时每次的x,y都必然小于p,所以也就必然与p互质,所以满足费马小定理。#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<map>#define原创 2017-08-14 14:35:38 · 373 阅读 · 0 评论 -
HDU 6114 Chess (组合数 思路)
思路:考虑一个n*m的矩阵,那么其上放置的最多的妻子(棋子)个数必然为 min(n,m) min(n,m) 。 所以我们现在只考虑n大于m的情况。 我们假想一个从1开始的n*m的矩阵。从n个数中不重复的选m个,根据题目中要求的:对于任何一个車A,如果有其他一个車B在它的上方(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B)。所以我们可知一旦我们选择好了这m个数字都是n中的哪些,这原创 2017-08-14 14:15:14 · 268 阅读 · 0 评论 -
HDU 6108 小C的倍数问题(数学 推公式)
思路:假设一个进制p,一个数n,现在我们要求一个数B,使得n的各个位上的数加起来是b的倍数,那么n为B的倍数。类似于这样的数。 我们知道n一定可以表示成系数乘以进制的形式,如: n=a∗1+b∗p+c∗P2+d∗p3...n = a*1 + b*p + c*P^2 + d*p^3 ... 而且同时我们知道:a+b+c...=Ba+b+c... = B 那么上个式子则可以化简为:n=B+b∗(p−原创 2017-08-12 21:07:08 · 571 阅读 · 0 评论 -
BZOJ 2440 完全平方数 (莫比乌斯函数 容斥)
思路:对于每一个数x,我们需要二分答案位置p考虑 [1,p][1,p] 有多少满足条件的数,如果这个数等于x,那么说明我们二分的答案p可能是答案(如果p正好是一个完全平方数或完全平方数的整数倍,那么这个p就不是答案,我们需要接着二分)然后是统计区间 [1,p][1,p] 里满足条件的数的个数的方法。 首先我们先假设这个区间里都是满足条件的,那么有res = p个。 然后我们从i=2开始枚举小于原创 2017-08-04 21:18:10 · 230 阅读 · 0 评论 -
BZOJ 1257 余数之和sum (取模原理+分块)
思路:考虑取模的原理:k%n=k−k/i∗ik\%n = k - k/i * i 如果你对莫比乌斯反演中的分块很熟悉的话,那么你一眼就能看出来:k/i的值最多只有2*sqrt(k)个,所以我们只需sqrt(n)的时间就可以完成。而且i的前缀和也不需要预处理,直接公式就有了。#include<stdio.h>#include <iostream>#include<string.h>#inclu原创 2017-08-11 21:33:48 · 271 阅读 · 0 评论 -
BZOJ 2705 Longge的问题 (欧拉函数)
思路:根据n的范围我们发现,就算是线性的扫一遍也不行(1e9的复杂度太高了)。 所以考虑一种logn或者sqrt(n)的方法;我们知道这种题多半是不能按照题意直接做,而是要考虑每个gcd对答案的贡献。 考虑n的因子i,以i为gcd的对答案的贡献即为 gcd(某个数,n)==igcd(某个数,n)==i 的个数乘以i。又因为这道题要算的gcd中有一个是固定值,所以我们可以考虑将之转化为欧拉函数,即原创 2017-08-11 21:27:46 · 270 阅读 · 0 评论 -
CSU 1325 A very hard problem (莫比乌斯反演)
思路:第二问直接处理得到。 关键是第一问,问的是gcd为p约数的有序对的个数。 举个栗子:p等于6 那么 f(1)=μ(1)∗F(1∗1)+μ(2)∗F(1∗2)+μ(3)∗F(1∗3)+μ(4)∗F(1∗4)... f(1) = \mu(1)*F(1*1) + \mu(2)*F(1*2) + \mu(3)*F(1*3) + \mu(4)*F(1*4) ... f(2)=μ(1)原创 2017-08-07 21:50:55 · 253 阅读 · 0 评论 -
CSU 1803 2016 (数论+思路)
思路:我们可以将a,b分解为 a=k1∗2016+ia = k_1*2016 + i b=k2∗2016+jb = k_2*2016 + j 所以我们可以推出,使得 a∗b==0(mod2016) a*b == 0 (mod2016) 只需 i*j == 0 (mod 2016) 所以我们只需在2016内遍历i,j即可,然后计算出第一个数有多少个i,第二个数有多少个j,相乘计入答案。这样就原创 2017-05-06 13:01:29 · 89 阅读 · 0 评论 -
HDU 2601 An easy problem (数论)
思路:可以化简为 N+1 = (i+1)*(j+1);坑点:注意i*i爆int了。。。#include <iostream>#include <cstdio>#include <string.h>#include <queue>#include <cmath>#include <algorithm>#include <map>typedef long long int lli;usi原创 2017-02-19 09:31:36 · 112 阅读 · 0 评论 -
HDU 4497 GCD and LCM (分解质因数)
题意:给你G,L,问你以G为最大公约数且以L为最小公倍数的三元组(x,y,z)有多少种,注意:(1,2,3)和(1,3,2)是不同的。思路:我们要找满足 gcd(a,b,c)=G,lcm(a,b,c)=L{gcd(a,b,c) = G , lcm(a,b,c) = L} 的 a,b,c,所以如果存在的话,那么必有 a=0(modG){ a =0\pmod G} ,bc同理。同时:L=0(原创 2016-08-12 15:14:26 · 395 阅读 · 0 评论 -
POJ 3292 Semi-prime H-numbers (类似素数筛)
题意:定义一种数叫H-numbers,它是所有能除以四余一的数。 H-numbers分三种: 1、H-primes(素),这种数只能被1和它本身整除,不能被其他的H-number整除 2、H-semi-primes(半素)是由两个H-primes相乘得出的 3、剩下的是H-composite(合数) 问给一个数,求1到这个数之间有多少个H-semi-primes注意不要把合数算进去了。#i原创 2017-01-16 13:39:51 · 235 阅读 · 0 评论 -
POJ 2115 C Looooops (模线性方程)
题意:给你A B C K四个变量,问你对于这样一个for循环在循环多少次之后跳出 for(int i = A ; i != B; i += c){ nothing; } 注意这里对i的bit做了限制,只有k个bit,默认为无符号,也就是说 i=i(mod2k){i = i \pmod {2^{k}}}思路:设次数为x,得到方程:A+C∗x=B(mod2k){A + C * x =原创 2016-08-12 21:56:01 · 277 阅读 · 0 评论 -
HDU 1573 X问题 (中国剩余定理 模线性方程组)
思路:问题可以转化为求模线性方程组。 设要求得的满足方程组的最小正整数为n; n=b1(moda1){n = b_1\pmod {a_1}} n=b2(moda2){n = b_2\pmod {a_2}} 可以得到: n=b1+x∗a1=b2+y∗a2{n = b_1 + x*a_1 = b_2 + y*a_2} 变形之后: x∗a1−y∗a2=b2−b1(1){x*a_1 - y原创 2016-08-17 16:59:53 · 552 阅读 · 0 评论 -
HDU 1576 A/B(乘法逆元)
有关乘法逆元:1,为什么要用乘法逆元。假设有这么一种情况:你需要求 a/b % M 的值,但是由于a过大,所以你在算a的过程中不断地取模了,当然对于加减乘来说这样并不改变结果的正确性,但是。。。之后你又得除以b,这就很尴尬了,假如你没有取模之前算出来的 a = 1 000 000 008 ,b = 2,但是M = 1 000 000 007,所以取模之后为1,1/2 等于多少呢?0,对吧,但是这原创 2016-08-10 14:33:30 · 315 阅读 · 0 评论 -
HDU 5514 Frogs(容斥原理 gcd)
题意:有n个青蛙,一开始都在0点,然后有m个石子圈成一圈的石子,石子的编号是从0-m-1的然后青蛙只能顺时针跳,每个青蛙可以一次跳a[i]格,然后所有青蛙都这样一直跳下去然后问你,这些青蛙踩过的石子的编号和是多少?思路:啊我这只弱鸡,,,只能照着大神的思路写下来,,然后就基本一样了。。。#include <cstdio>#include <iostream>#include <cmath>#i原创 2016-10-02 14:25:24 · 460 阅读 · 0 评论 -
HDU 5512 Pagodas (简单博弈 gcd)
题意:给你n,a,b三个数 a!=b{a != b} ,在 [1,n]{[1,n]} 这个范围内, 构造一个集合,这个集合初始只有 a,b{ a,b } 然后你可以通过加减两种运算对这个集合中的数据进行扩增,直到不能扩增。 注意限制条件:新的元素必须在 [1,n]{[1,n]} 内且最多出现一次 先不能行动的输。 问你先手Y和后手I谁赢?思路:找规律可以发现:在这个最终构建的集合里,最小间原创 2016-10-01 21:50:13 · 340 阅读 · 0 评论 -
HDU 2521 反素数(分解质因数)
思路:其实跟反素数没有什么关系,就是让你求区间里的数的因数的个数最多的那个值,如果有多个符合,取最小。 分解质因数,比如24可以分解为: 23∗31{2^3*3^1} 所以24的所有因数的个数就是(3+1)*(1+1) = 8 仔细考虑一下,每个质因子的幂指数都可以选择【0,x】。AC代码:#include <iostream>#include <cstdio>using namespace原创 2016-09-16 15:29:45 · 363 阅读 · 0 评论 -
POJ 2417 Discrete Logging (BSGS)
AC代码():有待修改#include <iostream>#include <cstdio>#include <string.h>#include <cmath>#include <map>typedef long long int lli;using namespace std;inline lli qp(lli a,lli x,lli c){ lli ans = 1;原创 2016-09-09 23:27:45 · 256 阅读 · 0 评论 -
HDU 4596 J - Yet another end of the world(数论)
题意:给你n个 xix_i,yiy_i,ziz_i,让你判断是否存在一个数num, 满足形如下式的条件,满足的话则代表此飞船在这个虫洞的作用力下,那么这个num号飞船不能再同时再处于另一个冲动的引力下,否则会被潮汐力撕碎。。。现在问你是否有被撕碎的危险。 y<=num(modxi)<=z y <= num(mod x_i) <= z思路:遍历两两组合的全部。对于任意的两个有如下的特点。 numm原创 2017-04-15 20:49:25 · 304 阅读 · 0 评论 -
HDU 6027 Easy Summation (gcd)
思路:消除冗余操作。 分别从左到右(lef数组)和从右到左(rig数组)进行gcd 然后对于i(从2到n-1),找出gcd(lef[i-1],rig[i+1])最大的值#include <cstdio>#include <iostream>#include <string.h>#include <queue>#include <algorithm>typedef long long i原创 2017-07-03 20:58:40 · 380 阅读 · 0 评论 -
HDU - 2604 Queuing (递推 + 矩阵快速幂)
#include <cstdio>#include <iostream>#include <string.h>#include <queue>#include <algorithm>typedef long long int lli;using namespace std;int mod;const int n = 4;struct mat{ lli ma[n][n];}原创 2017-07-04 21:35:25 · 248 阅读 · 0 评论 -
poj 2728 Desert King (最优比率生成树/01分数规划)
思路:#include <iostream>#include <cstdio>#include <algorithm>#include <math.h>#include <queue>#include <string.h>using namespace std;struct node{ int x,y,z;}a[1010];int n;double mapp[1010][1010原创 2017-07-05 15:47:07 · 362 阅读 · 0 评论 -
POJ 2976 Dropping tests (01分数规划)
类似于poj2728那道题。详情请看 http://blog.csdn.net/wing_wuchen/article/details/74452401#include <iostream>#include <cstdio>#include <algorithm>#include <math.h>#include <queue>#include <string.h>typedef lo原创 2017-07-05 20:10:19 · 205 阅读 · 0 评论