随笔分类 - 数学
摘要:这个题目要求既对序列的某段区间求和p互质数目,又支持对某个数进行修改一开始看到这个题,有点懵,就是因为第二个操作,如果只是第一个操作,并且是原始序列1-n,那就很简单了,按照之前写过的某个题目,求出1-y中的数目,减去1-x中的数目即可就是第二个操作把序列打乱了,这样就不好搞了后来还是大神博客的一句...
阅读全文
摘要:求一个平面内可见的点,其实就是坐标互质即可,很容易看出来或者证明所以求对应的欧拉函数即可#include #include #include #include using namespace std;int phi[1010];int n;void calc(int x){ for (int ...
阅读全文
摘要:求一串序列里面的4个数互质 的个数依然是反向考虑,求序列里面四个数不互质的个数,最后用总数减去即可求四个数不互质的个数,直接求不好求,不如求公因子为2的,为3的,为。。。的有多少个,然后用容斥原理,先求出为2的,为3的。。再减去为2和3的,为3和5的。。。再加上公因子为3个的。。。即可#includ...
阅读全文
摘要:一开始看这个题目以为是个裸的矩阵快速幂的题目,后来发现会超时,超就超在 M = C^(N*N). 这个操作,而C本身是个N*N的矩阵,N最大为1000。但是这里有个巧妙的地方就是 C的来源其实 是= A*B, A为一个N*k的矩阵,B为一个k*N的矩阵,k最大为10,突破的就在这里,矩阵的结合律要用...
阅读全文
摘要:哎。这个题想了好久,状态不对啊。。。一个大家都出的题。。当时想到肯定是可以有什么规律来暴力,不用算到10的10次方对于某个k,x。从1到k循环,每次求一个新的x,这个x要大于等于原x,并且要是i的倍数。。。一直觉得有规律可循,后来知道就是倍数,我们设倍数为 b, 则b2*(i+1)>=b1*(i);...
阅读全文
摘要:题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着。看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控时间内做出来的,因为碎片到底放哪里以及是正着放还是反着放都是不可控的。这个时候数学建模就真的好重要了,...
阅读全文
摘要:是时候要做做数学类的题目了这属于比较简单的矩阵快速幂了,因为有个已知的矩阵循环的结论,所以为了节约时空,只需要保留一行即可,这个稍微有点难写,也不是难写,主要是注意细节。其他的矩阵快速幂一下即可#include #include #include #include #define N 505#def...
阅读全文
摘要:还是聪哥给我讲的思路才知道的,起初我利用两两互质去求发现有问题,互质只是必要条件而非充分条件,后来还是用的标准思路即其实最终只要保留最大的素数的幂即可,其他包含该素数幂但指数低的都不用了,这样就能保证序列最小公倍数不变,同时,为了字典序最小,只需一点小小的处理。在处理的时候遇到些小问题,主要是没考虑到每个值得因子没有求尽。#include #include #include #include #define ll long longusing namespace std;ll num[550],ans[550],prime[550];int n;ll gcd(ll a,ll b){ if...
阅读全文
摘要:求火柴的组成的数字最多能组成多少种数字,典型的递推问题但是因为结果巨大,要用高精度运算一开始手写高精度,不仅挫的要死,最后还WA了。最后学了一下白书上面的bign类,相当方便啊。#include #include #include #include #include #define N 720using namespace std;struct bign{ int len,s[N]; bign() { memset(s,0,sizeof s); len=1; } bign(int num) {*this=num;} string ...
阅读全文
摘要:真是脑残。。。擦具体题解在这里http://www.cnblogs.com/windysai/p/3619222.html原本我为了防止两个数冲突,设置了好多判断,结果发现,如果两个数冲突,另外找两个 i,s+1-i输出就行了,因为两个数冲突 和必定为s+1,反正最后只是要求总和相同,找两个没有访问...
阅读全文
摘要:今天下午Virtual了一套最近的CF题,第三题给TLE了,就跑过去上课了。这题给定一个由二进制表示的矩阵,当询问3的时候,求矩阵的值,矩阵的值是所有第i行乘以第i列的值的总和,然后还有1 b是翻转b行的数字 2 b是翻转b列的数字一开始没怎么考虑复杂度,就直接想暴力过,觉得只要把翻转先暂存,最后有询问3的时候再pushdown再计算一下结果。。。简直不经大脑思考,有10^6询问,我这样做,如果询问全部是3,那光是计算矩阵10^6次就能达到12次方的复杂度。。。真是一点都不考虑。。。后来在课上想了点方法,觉得把每一行和列的翻转都预处理一下,以及先把原始结果预处理出来,然后遇到翻转就跟之前的状态
阅读全文
摘要:这个题目搞了我差不多一个下午,之前自己推出一个公式,即 f[n+k]=k*f[n]+f[n-1]结果发现根本不能用,无法降低复杂度。后来又个博客的做法相当叼,就按他的做法来了即 最终求得是 S(n)=f[b]+f[b+k]+f[b+2*k]....f[b+n*k] (原题的意思好像是不用加到第n项,但实测确实要加到该项)然后我们令 A={1,1}(标准的斐波那契矩阵) {1,0}发现 f[b]=A^b,f[b+k]=A^(b+k),....f[b+nk]=A^(b+nk);提取公共因子 A^b.S(n)=A^b*(E+A^K+A^K^2....A^K^n)再令K=A^K (K...
阅读全文
摘要:这个题目上周对抗赛题目,搞了我好久 对数学这种不是很敏感其实都不是自己想出来的,看其他的资料和博客的推导 还是有点难度的,反正我是推不出来通过二项式定理的化简有两个博客写得比较好http://972169909-qq-com.iteye.com/blog/1863402http://www.cppblog.com/Yuan/archive/2010/08/13/123268.html反正构造好二项式之后,乘N次,就可以得到结果了,因为右边的式子 初始全部是x。#include #include #include #define ll __int64using namespace std;con
阅读全文
摘要:就是经典约瑟夫环问题的裸题我一开始一直没理解这个递推是怎么来的,后来终于理解了假设问题是从n个人编号分别为0...n-1,取第k个,则第k个人编号为k-1的淘汰,剩下的编号为 0,1,2,3...k-2,k,k+1,k+2...此时因为从刚刚淘汰那个人的下一个开始数起,因此重新编号把k号设置为0,则k 0k+1 1...0 n-k1 n-k+1假设已经求得了n-1个人情况下的最终胜利者保存在f[n-1]中,则毫无疑问,该胜利者还原到原来的真正编号即为 (f[n-1]+k)%n (因为第二轮重新编号的时候,相当于把每个人的编号都减了k,因此重新+k即可恢复到原来编号)。由此,我们可以想象,当最.
阅读全文
摘要:我是用暴力过的,虽然网上说刘汝佳出的这道题考的是堆,我不太懂,。。用暴力时间复杂度高一些,但是一样能过所要注意的就是周期问题,因为只要同时存在某一天超过一头牛产奶量最小,就不会杀牛,而每头牛的周期和每天产奶量都不一样,我一开始用周期最长的做指标,如果超过这个指标还没有牛被杀,说明状态稳定,输出。。。但是这样是WA的。。。正确的周期应该是所有牛的周期的最小公倍数(也可以超过最小公倍数,但无疑最小公倍数是最优的),这也给了我一些新启发,周期不同的时候把所有可能性都走完,就是最小公倍数#include #include #include using namespace std;struct node
阅读全文
摘要:这个题目题意简单,但是TLE得哭哭的。。。输入 a b w x c五个数,最终要使得c=x,则 b=b-x,同时 c--;如果b=x的时候,c和a才差距减少1,我一开始的优化是,分别对于两个条件,第一个,直接求出b小于x之前总共能撑几秒,这样直接把c减少就行,。。。对第二个条件,稍微推导一下发现,每一秒b是递增了w-x(题目条件说了w>x),因此也可以直接求出b在满足该条件时能撑几秒,直接加到结果里。。。但是这样的优化显然不够,结果任然是TLE,所以需要更强力的推导于是前面已经说到,c和a只有在第一个条件的时候才会距离缩短1,也就是说从头到尾,第一个条件总共会占用 c-a秒,这个很好理解
阅读全文
摘要:这道题目我一开始想错了,觉得只要排好序,再从头到尾把可以相互交换的进行下交换就可以了。。。事实证明是错的。正确的解法比较巧妙,而且写法非常好,值得学习首先,要注意的一个规律是,假如最大的颜色数字出现的次数 为 c, c超过了n的一半,则必定无法将所有的人的颜色交换成两两不同的,而且此时颜色不同的人的数目也已经出来了就是 (n-c)*2,于此,也很容易得出,一旦c没有超过n的一半,则肯定能够把所有人都排成不一样的,(先把相同颜色的找另一类相同颜色的互换,某一类不够了,再找另一类的来继续补充一下即可)此时的答案就是n。进一步分析,如果是第一种情况,则一个很巧妙的处理方法就是从1到n遍历,如果当前i
阅读全文
摘要:这个题目挺有意思的,给定 起终点,要你求车,象,王分别最少要走多少步车横竖都能走,而且每步任意走几格,所以它是最容易处理的,如果在同行或者同列,就是1,否则就是2象要找下规律,象任意对角线都能走,而且每步任意走几格,这个时候,发现图上的黑白色块给了很大提示,如果两个本身在同一对角线,就是1,如果不在,就要判断下是否在同一色块,是就是2,否则,就走不到,输出0,至于判断是否为同一色块,非常简单,代码中给出。其实王也是非常简单的,八个方向都能走,但是每次只能走一步,只是我好脑残,连象的规律都找出来了,偏偏王还在一步步分情况,最后发现,其实不管是在八个方向内,还是不在八个方向上,最终走的步数就是 m
阅读全文
摘要:一个排队问题,f代表女,m代表男,f和m出现的几率相等。问一个长为L的队伍不能出现 fmf 和 fff这样的串总共有多少种。这个题目的公式递推略难啊。。。我看了别人博客才想明白原来是这么递推出来的。首先把前几项写出来。L=0 ,ans=0;L=1,ans=2;L=2,ans=4;L=3,ans=6;L=4,ans=9;规律有点难找,直接递推出来,假设 长度为n的串,n>4,ans[n] 无非就是在 ans[n-1]的基础上加一个 f或者m,如果在ans[n-1]的基础上在队列最后加一个m,则绝对合法,因为不论前面n-1个是怎么排列,最后加一个m,绝对不会构成fmf或者fff,所以 ans
阅读全文
摘要:这个题目确实是很简单的一个矩阵快速幂,但是我在求和的时候,用的是标准的求和,即,一共计算logN次Ak,但是这样会超时。后来就发现原来本身和Sn=Sn-1+Fn;即Sn本身可以写在矩阵当中,所以直接求一次 Ak就能得出结果。#include #include #include #include #include using namespace std;struct Mat{ int mat[4][4];};Mat it,E,E0;void init(){ memset(it.mat,0,sizeof (Mat)); memset(E.mat,0,sizeof (Mat)); ...
阅读全文

浙公网安备 33010602011771号