
数论
zhouyuyang233
此乃ZJ之蒟蒻也
望大牛勿喷
我等蒟蒻感激不尽
展开
-
bzoj1338: Pku1981 Circle and Points单位圆覆盖
传送门 首先,最有解一定是有一个点恰好在圆上。 然后我们枚举那个在圆上的点 然后我们计算出当圆心绕该店旋转时,其他点能被覆盖的区间 然后大力线段覆盖一发就行了 时间复杂度O(N^2logN)#include<bits/stdc++.h>using namespace std;struct P{double x,y;}p[505];struct data{ double t;原创 2017-07-28 21:20:00 · 431 阅读 · 0 评论 -
bzoj4920: 薄饼切割
传送门 首先要发现其实木棍覆盖区域是圆环形状的。 于是我们要求出大圆半径R和小圆半径r 首先大圆半径显然是在两个端点处取到的。 然后,发现点在木棍上移动是与圆心距离的函数是单峰函数。 于是我们可以三分求最小值。 然后问题九转化成了圆形面积和长方形面积的交。 分类要论以下就可以求出来了。#include<cmath>#include<cstdio> #include<cstdlib原创 2017-06-18 21:23:47 · 409 阅读 · 0 评论 -
bzoj1514: [POI2006]ZAB-Frogs
传送门 显然在求出最短距离之后是可以二分答案的。 我们考虑按照每列来计算每个点的最短距离。 显然可以发现,对于该列来说,每一行都可能有一个到该列最近的点,并且我们发现,如果某一行有两个坏点的话,假设分别为A,B,并且A到该列的距离最近,那么B显然不会对这一列的dis有任何影响。 所以我们显然可以在求之前预处理一下每一行的如果存在坏点的那个最近的坏点的坐标。 接下来,我们讨论坏点k,l原创 2017-06-01 18:55:11 · 399 阅读 · 0 评论 -
bzoj1547: 周末晚会
传送门 首先,模数tm是1e8+7!!!!! 考虑burnside。 枚举循环同构时旋转了x位,则循环节为gcd(n,x); 如果gcd(n,x)<=k,答案为2^gcd(n,x)-(k<=n) 否则的话 用f[i][j]表示长度为i的线段(不是环),最后有且仅有j个女生,没有超过k个女生坐在一起的方案数 F[i][j]表示长度为i的线段,最后有且仅有j个女生,且第一个是男生,没有超过原创 2017-06-05 20:42:30 · 562 阅读 · 0 评论 -
bzoj1467: Pku3243 clever Y
传送门 #include<map>#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define ll long longusing namespace std;ll a,b,P;map<ll,ll> mp;ll gcd(原创 2017-05-31 17:30:43 · 294 阅读 · 0 评论 -
bzoj1101: [POI2007]Zap
传送门 傻逼莫比乌斯反演练手题。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define N 50005using namespace std;int tot,T,x,y,z,ans,mo[N],fl[N],pri[N];原创 2017-05-19 17:57:50 · 230 阅读 · 0 评论 -
bzoj1428: Christopher
传送门 大力Lucas定理。 首先将N,M转化为P进制数。 然后发现只要有一位满足mi>ni就是0 发现不太好算。 转化为C(n,m)!=0的计算。 发现所有mi必须小于等于ni。 方案数=Πni+1\Pi{n_i+1}#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostre原创 2017-05-30 21:23:07 · 204 阅读 · 0 评论 -
bzoj1408: [Noi2002]Robot
传送门 题目大半的篇幅在介绍ϕ\phi和μ\mu 不过不是普通的φ和μ,有些变形- - 新定义的φ(1)=0,新定义的μ只计算奇质数,含有2为因子的数都按照μ值为零处理 我们首先求出第一问和第二问,即μ值不等于0的部分 由于μ的定义,μ值不等于0当且仅当每个质因数的次数都是1次 因此我们枚举每个奇质数 计算加上这个奇质数之后φ值之和多出来的部分 由于φ是积性函数 所以前两问可以在O(n原创 2017-04-25 07:47:37 · 273 阅读 · 0 评论 -
bzoj1406: [AHOI2007]密码箱
传送门 首先x2=kn+1首先x^2=kn+1 然后x2−1=kn然后x^2-1=kn 得到(x−1)(x+1)=kn+1得到(x-1)(x+1)=kn+1 设x−1=k1n1,x+1=k2n2,k1k2=k,n1n2=n设x-1=k1n1,x+1=k2n2,k1k2=k,n1n2=n 爆枚n2(n2>n1),代入答案验证。#include<cstring> #include<cmat原创 2017-04-25 07:34:42 · 289 阅读 · 0 评论 -
bzoj1100: [POI2007]对称轴osi
传送门 一看到几何题就蛋疼系列 然后看到了100w的巨大数据。 然后我怂了,去看了题解,才知道,这么一道像极了几何的题目竟然使用字符串的方法来解决的。瞬间orz膜倒在地。 这个思路:把这个图形写成一个字符串的形式S,然后复制一遍SS,再用它的反串S’跑一边,看看能够匹配多少次。答案就是多少了。 觉得直接跑一边manacher更合适,统计起来更简单。#include<cmath>#incl原创 2017-05-06 21:43:37 · 846 阅读 · 0 评论 -
bzoj1409: Password
传送门 其实题目就是求p^F[n] 发现p,q互质,于是我们开心的大力用欧拉函数和矩阵快速幂 据说暴力求欧拉函数会被卡?#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define N原创 2017-05-25 20:53:31 · 421 阅读 · 0 评论 -
bzoj4921: 互质序列
传送门 首先题目答案可以分为三部分:只取左边,只取右边,两边都取。 发现这些问题可以由前缀gcd和后缀gcd得到。 然后可以证明前缀gcd和后缀gcd一定可以分成段数不超过logAi的相同子序列。 因为每一次gcd改变,至少除以2. 然后就是枚举起点套终点的问题了。 话说标程是O(N)的,但是我是O(NlogAi^2的) 像这种数据范围怎么可能卡log^2算法呢?#include<cm原创 2017-06-18 21:29:31 · 1497 阅读 · 0 评论 -
bzoj1857: [Scoi2010]传送带
传送门 我们三分两个转折点。 显然在第一个点确定时时间关于第二个点坐标的函数是单峰函数 同时最优时间关于第一个点的坐标的函数也是单峰函数 大力三分套三分不虚。#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>using name原创 2017-06-28 20:58:50 · 232 阅读 · 0 评论 -
bzoj1534: [POI2005]Sum- Fibonacci sums
传送门 首先暴力相加。然后考虑修改。 首先2*f[i]==f[i]+f[i-1]+f[i-2]=f[i+1]+f[i-2],转化为f[i+1]++,f[i-2]++; 然后如果f[i]==1&&f[i+1]==1,转化为f[i+2]++; 然后xjb乱搞一发就ok了。#include<cmath>#include<cstdio> #include<cstring>#include<cs原创 2017-06-03 21:34:03 · 569 阅读 · 0 评论 -
bzoj1300: [LLH邀请赛]大数计算器
传送门 最后的十二位我们大力质因数分解之后快速幂爆出来。 前面已看只有三位于是考虑大力用log来爆过去。 我们计算出答案的log值,然后截取ans-int(ans)+2的log值。 然后我们大力pow一波然后取整爆过去你就AC辣。#include<bits/stdc++.h>#define mo 1000000000000ll#define ll long long#define N原创 2017-07-27 21:34:30 · 416 阅读 · 0 评论 -
bzoj1436: Poi2003 Trinomial
传送门 神题啊。 答案=C(n*2,m)*(m mod 2+1) mod 3. 证明挖坑。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define ll long longusing namespace std;int原创 2017-05-30 21:35:10 · 565 阅读 · 0 评论 -
bzoj1867: [Noi1999]钉子和小球
传送门 大力dp 首先的到状态: 小球落在第i行第j个钉子上的概率。 然后得到转移: f[i+2][j+1]+=f[i][j](i,j没钉子) f[i+1][j],f[i+1][j+1]+=f[i][j]/2(i,j有钉子)“` type arr=array [1..2] of int64; var a:array [-1..55,-1..55] of char; f:a原创 2017-07-05 21:51:44 · 264 阅读 · 0 评论 -
bzoj1856: [Scoi2010]字符串
传送门 巧妙的思想。 首先我们可以将0看成(1,-1)的向量,1看成(1,1)的向量 然后题目就变成了从(0,0)走到(n+m,n-m)且不经过直线y==-1的方案数。 我们首先去掉不经过直线y==-1的方案数,发现答案=C(n+m,n) 然后我们考虑计算GG的方案数。 首先,GG的方案数和y=-1一定有交。 于是我们找到最后一次和y=-1的交,然后将之前的部分以y=-1为对称轴翻转。原创 2017-06-26 21:27:23 · 276 阅读 · 0 评论 -
bzoj1853: [Scoi2010]幸运数字
传送门 首先我们求出10e以内的幸运数。 然后发现很多数字能被其他幸运数整除。 然后我们运用容斥原理枚举因数即可。#include<iostream>#include<cmath>#include<algorithm>#include<cstring>#include<string>#include<cstdio>#define ll long longusing namespa原创 2017-06-26 21:10:42 · 251 阅读 · 0 评论 -
bzoj1836: Pku3004 Subway planning
传送门 我们可以先求出每个点能被覆盖到的角度区间。 然后我们枚举覆盖起点,大力线段覆盖就可以了。 时间复杂度O(N^2T)#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define pi acos(-1)#define e原创 2017-06-23 21:29:05 · 256 阅读 · 0 评论 -
bzoj1799: [Ahoi2009]self 同类分布
传送门 因为模数最多只有9*17=163,所以我们暴力悲剧模数。 然后就是dp辣。 设f[0/1][i][j][k]表示填了前i位,和是j,数字对mo取模的值是k,前边的数字是否前部和上限相同(0)的方案数。 xjb转移一下就行了。 开心的刷到第一页。#include<cmath>#include<cstdio>#include<cstring>#include<iostream>原创 2017-06-12 21:28:08 · 285 阅读 · 0 评论 -
bzoj1923: [Sdoi2010]外星千足虫
传送门 返现答案给出的是一些xor和的条件 这个显然可以用高斯消元做 加上bitset优化可以做到O(MN^2/w)#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cstdlib>#include<bitset>#define ll long原创 2017-07-12 21:46:14 · 217 阅读 · 0 评论 -
bzoj1913: [Apio2010]signaling 信号覆盖
传送门 我们发现凸四边形贡献为2,凹四边形贡献为1 而且四边形总个数=C(n,4) 所以我们只要知道凹四边形的个数就可以了 我们枚举在凹四边形中内角大于180的点 然后我们将其他点按照极角序排序 枚举极角差刚刚不小于π的两条边 那么这两条边之间的点和其中一条边上的点不包含中间点。 由于按照极角排序,那么枚举的时间复杂度是O(n)。 设p为不包含中间点的三角形个数,那么以该点为中间点原创 2017-07-11 22:03:05 · 338 阅读 · 0 评论 -
bzoj1822: [JSOI2010]Frozen Nova 冷冻波
传送门 先用计算几何判断某个巫师是否能够施法到某个小精灵。 然后二分答案,用网络流验证就可以了。#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>#define eps 1e-10#define inf 0x3f3f3f3f#d原创 2017-06-21 21:14:08 · 232 阅读 · 0 评论 -
bzoj1336: [Balkan2002]Alien最小圆覆盖&&1337: 最小圆覆盖
1337传送门 1336传送门 随机增量法求最小圆覆盖。 假如已经求出了前i-1个点的最小圆覆盖,假如第i个点后,如果不在所求的圆內,那么这个点一定在新圆的边界上。这样我们只要枚举另外两个点就可以了,因为三点确定一个圆。 枚举方法为:从1-(i-1)枚举一个不在圆內的点j,再从1-(j-1)枚举一个不在圆內的点k,那么i j k三点就可以确定一个圆。(注意三点共线的特殊情况) 这样的枚举方原创 2017-05-24 20:26:04 · 264 阅读 · 0 评论 -
bzoj1308: fac
传送门 题目看上去非常不可做。 考虑缩小答案规模。 首先将25!拆分: 25!=(1∗2∗3∗4∗5)∗(6∗7∗8∗9∗10)∗(11∗12∗13∗14∗15)∗(16∗17∗18∗19∗20)∗(21∗22∗23∗24∗25)25!=(1*2*3*4*5)*(6*7*8*9*10)*(11*12*13*14*15)*(16*17*18*19*20)*(21*22*23*24*25) 将原创 2017-05-23 21:21:15 · 409 阅读 · 0 评论 -
bzoj1211: [HNOI2004]树的计数
传送门 Prufer序列,具体参考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每个数分解质因数,把质因数的次数相加相减,然后再乘起来 注意此题无解需要输出0 当n!=1&&d[i]==0时 输出0 当Σ(d[i]-1)!=n-2时输出0#include<iostream>#include<cmath>#include<cstdio>#include<cstd原创 2017-04-08 15:52:02 · 338 阅读 · 0 评论 -
bzoj2705: [SDOI2012]Longge的问题
传送门 我们可以先枚举最小公倍数,设其为x,时间O(sqrt(n)) 然后可以求出与n/x互质的数,时间O(sqrt(n/x)) 时间复杂度远跑不到O(n)上界#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#define ll原创 2017-03-07 17:42:54 · 192 阅读 · 0 评论 -
bzoj2186: [Sdoi2008]沙拉公主的困惑
传送门 题目要求求出phi(m!)*(n!/m!) 注意到phi(m!)=m!*(p-1)/p(p是m!的质因子),模数固定。 所以答案就是n!*(p-1)/p(p是m!的质因子) n!可以在线性时间内求出,(p-1)/p(p是m!的质因子)也可以用线性筛求出。 本题略卡时限。#include<bitset> #include<cstdio> #include<cstring>原创 2017-03-07 13:56:08 · 404 阅读 · 1 评论 -
bzoj2749: [HAOI2012]外星人
传送门 欧拉函数都会求的吧。 首先给出一个结论:做一次phi只会消去一个2(自己yy) 设奇数x能分解产生f[x]个二,则消去他要f[x]+1次。 f[x]是积性函数(自己yy),可以O(N)求出。 当然,当开始是奇数时,还要再多一次 求一下sigma就行了。#include<iostream>#include<cstdio>#include<cstring>#include<cm原创 2017-03-07 15:38:50 · 400 阅读 · 0 评论 -
bzoj2190: [SDOI2008]仪仗队
传送门 我们可以先考虑下三角矩阵,之后答案*2(上三角矩阵)+3右下角三个特殊点。 显然当坐标i,j(i,j)!=1满足gcd(i,j)=1时可以看得见。 所以我们用线性筛求欧拉函数,答案就是sigma(phi(i))*2+3(2<=i<=n).#include<iostream>#include<cstdio>using namespace std;int n,ans,s,p;int原创 2017-03-07 13:48:24 · 353 阅读 · 0 评论 -
bzoj1876: [SDOI2009]SuperGCD
传送门 哈,不用高精度的做法应该都会吧、 可是要高精度。 于是我们可以将A%B化为A-B^x-…… x为2的幂次。 这样用辗转相除法求出gcd#include<cstring> #include<cmath> #include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm>#defi原创 2017-03-07 09:52:22 · 326 阅读 · 0 评论 -
bzoj1407: [Noi2002]Savage
传送门 因为本题数据范围不大,所以考虑暴力枚举。 我们可以用扩欧来判断他们的最早相遇时间,若他们都活着,则不合法。 ps:本题不能用二分。#include<cstring> #include<cmath> #include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm>using nam原创 2017-03-07 07:41:17 · 271 阅读 · 4 评论 -
bzoj1485: [HNOI2009]有趣的数列
传送门 显然当奇数位确定下来是,要么有确定解,要么无解。 于是我们可以脑补出一个dp F[I][J]:前i个奇数位位,末位是j的方案数。 暴力求解后发现是卡特兰数(呵呵呵呵) 我们可以将一个奇数项的数看成入栈,偶数项的数看成出栈,则每一个合法的出栈入栈序对应一个合法解。(自己yy) 这样就OK了 注:可以用质因数分解避免求乘法逆元。uses math;var a,b,p:arra原创 2017-03-07 07:52:37 · 478 阅读 · 0 评论 -
bzoj1007: [HNOI2008]水平可见直线
传送门维护一个下凸包是显然的于是乎我们可以先按照斜率排序,斜率相同时按照截距排序。然后我们可以维护一个单调栈,满足相邻两条直线交点坐标不降(注意,不是递增)跑完之后输出序号就ok啦。我才不会说我是学hzwer的呢/************************************************************** Problem: 1007原创 2017-02-17 17:31:05 · 273 阅读 · 0 评论 -
bzoj1005: [HNOI2008]明明的烦恼
传送门膜拜PoPoQQQ大爷,题解树的Prufer编码,以下内容摘自度娘:Prufer数列是无根树的一种数列。在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2。它可以通过简单的迭代方法计算出来,一个树对应一个Prufer数列。Prufer序列显然满足一个性质:一个点若度数为d,则一定在Prufer序列中出现了原创 2017-02-17 17:26:20 · 466 阅读 · 0 评论 -
bzoj1013: [JSOI2008]球形空间产生器sphere
传送门 高斯消元模板题#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<cstdlib>using namespace std;int n;double x,f[15],a[15][15];int main(){ scanf("%d",原创 2017-03-14 07:56:11 · 248 阅读 · 0 评论 -
bzoj1954: Pku3764 The xor-longest Path
传送门 首先假设1为根,求出根到当前节点的xor距离。 然后将xor距离转化为二进制串,建立Trie树。 强制一些点在答案上,然后在Trie树上跑贪心。 显然答案是正确的。 时间复杂度O(n*32)#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#includ原创 2017-03-14 11:06:03 · 448 阅读 · 3 评论 -
bzoj1089: [SCOI2003]严格n元树
传送门 设f[i]表示深度小于等于i的树的个数。 得到公式 f[i]=f[i-1]^n+1 答案就是f[d]-f[d-1]; 高精度水过。type arr=array [0..5005] of int64;var f:array [0..20] of arr; n,d,i:longint;procedure cheng(a,b:arr; var c:arr); var i,原创 2017-03-31 08:55:11 · 400 阅读 · 0 评论 -
bzoj1263: [SCOI2006]整数划分
传送门 我们可以求出满足xx−1>(x−1)xx^{x-1}>(x-1)^x且xx+1>(x+1)xx^{x+1}>(x+1)^x的整数x 然后手玩一下发现x=3 所以要尽可能的多拆出3。 不难得到以下方案: 1.n%3==0 拆成n/3个3 2.n%3==1 拆成n/3-1个3,2个2 3.n%3==2 拆成n/3个3,1个2 高精度一发水过。uses math;var a:原创 2017-04-13 21:47:49 · 600 阅读 · 0 评论