10 2013 档案
摘要:难得AK一次啊 在评测的时候还被数据坑了→→第四题的数据竟然出乱码得分:400!!考试过程:第一题 求几个矩阵...好像很简单? orz陈崴大神一眼就A了 我拙计地想了很久 一直在考虑枚举两点是相邻点的做法 竟然没想到枚举两点做对角线 最后还是想到了O(n^2)的方法 但是浪费了很多时间第二题 求<=n 的最大反素数 数学题? 找规律? 列了一串反素数还是没发现什么规律 九点半了 只能想到分块打表 但是要打40000+的表 好像不能提交啊 再想就要挂了啊 不然等等打个表再找规律吧 为什么又是爆零节奏 果断看第三题第三题 列了一串字符串 好像很有规律啊 递归处理之第四题 单词接龙 刚开始把
阅读全文
摘要:orz又被AK大神虐爆了得分:60+100+100=260应得分:300→→考试过程:第一题又是坑爹的数学题orz 思路乱七八糟地想了快一小时 只推出了n<=3的做法只有40分- - 还是先看别的题目等等再慢慢想吧 不然要爆0了第二题 一眼就看到了期望0 0 顿时吓尿 又是3题数学?好吧 - - 第三题看上去是图论其实经过昨天的总结 貌似也不是很怕期望了 稍微一想好像很简单- - 求出每条边对答案的贡献就完了 业界良心啊有信心了 再看第三题好像很简单- - 连骗分的想法都没冒出来过 果断spfa 再求割点papapa...十点半 打完了~再来想第一题- - 突然发现草稿纸不够写了 算了开
阅读全文
摘要:AK大神又AK了!!! orzorzorz题意:给出一个字符串由'x'、'o'、'?''?'有一半的几率为'x' 一半几率为'o'得分为所有连续的'o'的个数的平方和如ooxooo 得分为2*2+3*3=13求期望得分题解:又是一道期望题! orzorzAK大神只写了20行的程序 我写了80多行这里讲下AK大神的神做法吧 我的‘做法太麻烦了- -f[i]表示到i点的期望得分T[i]表示是一个'x'到i点的期望长度 这样表示就能无视前面的'?'了!相当于
阅读全文
摘要:题解:首先我们要知道一个性质:把长度为n的序列变成目标序列最多需要n个操作证明1:我们可以将原序列上每位上的数字向目标序列相同位置的数字连一条有向边如:原序列: 1 2 3目标序列:3 1 2则 1指向3、2指向1、3指向2显然这样连完后 构成的图为若干个环我们只要将非自环(原序列和目标序列上的数一样)的环拿出来做操作即可这样显然我们需要花费 n-原序列和目标序列相同的个数 个操作所以我们需要构造目标序列使得原序列和目标序列相同的个数最多因为每个人左右是谁都已确定 所以我们对目标序列只能做翻转、平移先不考虑翻转我们需要再知道一个性质:假设差值为 (原序列-目标序列+n)%n如:原序列: 1 2
阅读全文
摘要:题解:首先我们要知道一个性质:如果有多条直径 这个核不论在哪条直径上 答案都是一样的这样我们就可以随便找一条直径 在这条直径上枚举核的位置并且dfs预处理maxlon[i] (i在直径上) 表示到i的路径不经过直径的 离i最远的点到i的距离这时核的偏心距就是max(maxlon[i],核的端点到直径的端点的长度) (i为核上的点)这样就能O(n)求解代码: 1 #include 2 const int N=301,M=1001; 3 struct inli{ 4 int next,data,lon; 5 inli(const int a=0,const int b=0,con...
阅读全文
摘要:题解:对于任意一对i、j(ij)使得a[k]j)使得a[k] 2 #include 3 const int N=1001,M=2000001; 4 struct inli{ 5 int next,data; 6 inli(const int a=0,const int b=0): 7 next(a),data(b){} 8 }line[M]; 9 int n,a[N],col[N],son[N],sta1[N],sta2[N],top1,top2,last[N],nl;10 void makeline(){11 for (int i=1;ia[i]){...
阅读全文
摘要:题解:又是搜索- - 加状态压缩剪枝二进制记下每行 每列 每个九宫格用过的数是谁 枚举的时候可以O(1)判断冲突还有个很重要的剪枝 把可能使用数字最少的格子先搜索代码: 1 #include 2 #include 3 #include 4 using std::sort; 5 const int N=82,n=9,val[10][10]={{0,0,0,0,0,0,0,0,0,0}, 6 {0,6,6,6,6,6,6,6,6,6}, 7 {0,6,...
阅读全文
摘要:题解:先一遍dfs看是否合法若合法 则从上面任意一点到达下面的点一定是连续的 拓扑求出上面每点到下面的点的区间把所有区间按头排序 贪心解决最少几个区间能覆盖全部区域之代码: 1 #include 2 #include 3 #include 4 using namespace std; 5 const int N=501; 6 struct info{ 7 int x,y; 8 info(const int a=0,const int b=0): 9 x(a),y(b){}10 }map[N][N],qj[N],move[4]={info(1,0),info...
阅读全文
摘要:题解:做这题的时候为了敢速度- - 直接orz了神小黑的题解其实我还是有想一个拙计的方法的- -dp:f[i][j] 表示到i点使用j个加速器 在i前上车的人的时间和轻松愉悦转移之 - - 但是有很严重的两个问题1.空间复杂度O(nk)爆掉2.时间复杂度O(nk^2)更呵呵- -于是弃疗正解:贪心!time[i]表示到i点的时间last[i]表示从i出发的人的最晚到达的时间sum[i]表示在i或i前下车的人数f[i]表示在i后time[j] 2 const int N=1002; 3 struct info{ 4 int x,y,t; 5 info(const int a=0,...
阅读全文
摘要:题解:刷了一天的noip啊 做了10题! 突然找回了做马拉松的感觉- -我中午竟然放弃治疗去看视频 做到晚上累得都快挂了 用电脑放一些rock 把音乐当咖啡硬撑下来 但是还是没能刷3届唉 显然速度刷题是很容易忘的 简单写一些题解 然后睡觉去(- -。zZ)赤裸裸的搜索 但是要加一些剪枝1.如果交换的两个方块颜色相同则不换2.如果移动时是向左且左边有方块则不动(左边的往右效果一样)3.如果任意颜色发方块个数为1或2 显然无解return我只加了这些剪枝速度貌似还不错 vijos上1300ms左右关键是很多人说这题很复杂 - -?其实思路清楚就不会(表示半小时搞定) 我感觉做这题就像在做游戏一样可
阅读全文
摘要:中国剩余定理的作用和线性模方程组差不多 都是求 x=ai(mod mi) 的解x
但是中国剩余定理有局限性 它要求mi两两互质 优点是常数快 而且代码短很多
中国剩余定理其实就是构造x=M1N1a1+M2N2a2+...+MkNkak
使得x在mod mi 时只有MiNiai>0 其他都为0 并且让MiNi=1(mod mi)
那么就能满足条件
具体的构造方法:
设M=m1m2...mk
Mi=M/mi 这时(Mi,m1)=1 就能用拓展欧几里得求出Ni使得 MiNi=1(mod mi)
阅读全文
摘要:题意:
给出n、m、k 求C(n,k)*H(n-k)%m的值 H(n-k)为错排公式
题解:
先算H(n-k)
计算H(n)有个通式:
H(n)=(-1)^n+((-1)^(n-1))n+((-1)^(n-2))n(n-1)+...+n(n-1)(n-2)...3
证明详见维基百科:
http://zh.wikipedia.org/wiki/%E9%94%99%E6%8E%92%E9%97%AE%E9%A2%98#.E7.AE.80.E5.8C.96.E5.85.AC.E5.BC.8F
因为我们是要算H(n-k)mod m的值 显然他的前不超过m项是>0的 而其它都为0 枚举求解即可
阅读全文
摘要:题意:
求第n个不为完全平方数倍数的数
题解:
网上有人说答案不会超过2n (求证0 0?) 竟然不超过2n 那么很明显就是用二分做了
二分判定就是要求小于等于n的合法的数的个数
不难发现一个数若为完全平方数的倍数 则他的质因子肯定有一个的指数大于1
那么合法的数的所有质因数质数肯定都为1
阅读全文
摘要:题意:求C(n,m) 如果C(n,m)的位数=13 就要知道前3位 和答案模10^10的值
阅读全文
摘要:题意:给出a、p、d、m 求a^x=d(mod p) 0m则输出0如果x 2 #include 3 #include 4 typedef long long ll; 5 typedef unsigned long long ull; 6 const ll mo=200003,N=20000; 7 ll a,p,d,m,sum=1,sq,hash[mo],hat[mo],pri[N],save[N],bo[N+1],tot,add; 8 ll gcd(ll a,ll b){ return b ? gcd(b,a%b) : a; } 9 ll extgcd(ll &x,ll &..
阅读全文
摘要:题意:求前n项的欧拉函数之和题解:预处理出所有欧拉函数 赤裸裸的模版题- - 没什么好说的代码: 1 #include 2 typedef long long ll; 3 const ll N=1000001; 4 ll n,phi[N],pri[N],bo[N]; 5 void makepri(){ 6 for (ll i=2;i<=N;i++){ 7 if (!bo[i]){ 8 pri[++pri[0]]=i; 9 phi[i]=i-1;10 }11 for (ll j=1;j<=p...
阅读全文
摘要:题意:给出n个模方程x=a(mod r) 求x的最小解题解:这就是个线性模方程组的模版题- - 但是有一些要注意的地方extgcd算出来的解x可能负数 要让x=(x%mo+mo)%mo而且mo不是等于lcm(r1,r2) 而是r2/gcd(r1,r2)代码: 1 #include 2 typedef long long ll; 3 ll n,a,r; 4 ll extgcd(ll &x,ll &y,ll a,ll b){ 5 if (!b){ 6 x=1,y=0; 7 return a; 8 }else{ 9 ll res=ex...
阅读全文
摘要:经过两天的努力 终于把AC大神的课件都看完了 感动啊啊啊TAT 顿时感觉智力上升了一个层次 之后看到数论的题目终于可以不用放弃治疗了~~~ 我会说我刚刚用了十分钟就把欧拉函数看完了吗~~~(其实之前就会-。-)欧拉函数也就是phi(n) 表示小于等于n的且与n互质的数的个数欧拉函数的公式是 phi(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)要证明这个公式 我们需要先证明一些简单的性质1.若p为素数 phi(p)=p-1小于某个素数的数都和这个素数互质- - 显然2.phi(p^k)=(p-1)*p^(k-1)小于等于p^k的数中不与p互质的数肯定都是p的倍数这些数有
阅读全文
摘要:求幂大法是可以对指数取模 而结果不变的快速求幂的方法:A^b=A^(b mod phi(B)+phi(B)) (mod B) (条件:b>=phi(B))证明:我们知道A^i mod m 会存在循环节 在循环节前可能存在一段不循环的数假设前r 为不循环的数s为循环节的长度也就是A^(r+i)=A^(r+i+s) (i>=0)要证明上面求幂大法 就是要证明 A^b mod B 的r>=phi(B) 且s|phi(B)也就是A^b mod B 当bB|p^(r+s)-p^r->B'*(p^r0)|p^r*(p^s-1)因为(p^r0,p^s-1) 所以r至少要取r0
阅读全文
摘要:被数论怒虐了一天 心力憔悴啊 感觉脑细胞已经快消耗殆尽了>_< 但是今天还是会了很多之前觉得特别神的东西比如BSGS之前听了两遍 好像都因为听得睡着了没听懂-。- 今天终于硬着头皮学会了~ 做个总结吧 免得又忘记- -BSGS:BSGS就是求 A^x=B(mod C) 0<=x<C的解(C为素数)做...
阅读全文
摘要:由于被AK大神误导 - - 导致之前写了一个完全错误的总结 特此修改之求方程组 x=a[i](mod r[i]) 的解x即为求解方程 x=a[i]+r[i]*y联想普通方程组的解法 一直将两个方程合并成一个 最后只剩一个方程 求解即可设待合并的两个方程为 x=a1+r1*y、x=a2+r2*z合并之a1+r1*y=a2+r2*z->r1*y+r2*z=a2-a1拓展欧几里得求出(y,z)则x最小为a1+r1*y这时两方程合并为 x=a1+r1*y(mod lcm(r1,r2))就这样两两合并 如果某次(y,z)无解 则方程组无解代码: 1 scanf("%d%d",&
阅读全文
摘要:求方程ax=c(mod b)的解可将其转换为 ax+by=c有解条件:(a,b)|c设k*(a,b)=c用拓展欧几里得求出方程ax+by=(a,b)的解(x,y)x'=k*x,y'=k*y 就是方程的一个解所以x'+i*(b/(a,b)) (i=0,1,2,..,(a,b)-1)是原方程的解证明:设sx[i]=x'+i*(b/(a,b)),sy[i]=y'-i*(a/(a,b))则需证明a*sx[i]+b*sy[i]=ca*sx[i]+b*sy[i]=a*(x'+i*(b/(a,b)))+b*(y'-i*(a/(a,b)))=ax'
阅读全文
摘要:今天开始看orz数论了 数论一直是我最弱的一项 (一学数论就想睡觉啊啊TAT .zZ)从初三到现在每年都有学 每年都忘 于是乎做一个总结 希望能掌握神奇的数论去年noip就考了拓展欧几里得的模板题 因为不会 送了100分- -拓展欧几里得说简单了其实就是 给出方程ax+by=gcd(a,b) 求解(x,y)有学过快速求gcd的都知道 gcd(a,b)=gcd(b,a%b) 我们可以用这个性质求解假设已经知道bx+(a%b)y=gcd(b,a%b)的解(x,y)bx+(a%b)y=gcd(b,a%b)->bx+(a%b)y=gcd(a,b)->bx+(a-a/b*b)y=gcd(a,
阅读全文
摘要:题意:有n个大臣和一个国王左右手都写了数字 让大臣们站在国王的后面 每个大臣能获得前面所有人左手上数字乘积除以该大臣右手上的数字的金钱 问如何安排大臣顺序 使得获得金钱最多的大臣获得的金钱最少题解:看到最大值的最小值 最先想到的肯定是二分答案判断答案是否可行我有一个思路(未能验证正确性) 从后往前确定某个位置上要放哪个大臣求出所有大臣左手乘积*国王左手上的数 再将大臣按左手从大到小排序 找到第一个能放在该位置的大臣(获得金钱x[i+1]*y[i+1] 那么将他们交换答案不会更差设i前所有人左手乘积为a 则交换前两大臣获得的钱分别为a/y[i]、a*x[i]/y[i+1]而交换后钱分别为a/y[
阅读全文
摘要:题意:给出一颗n个节点有边权的树 和m个军队所在的位置 军队从某节点移动到相邻节点要花费边长度的时间 求最少要多少时间使得根节点(编号为1)到每个叶子的路径上最少有一支军队(根节点不能有军队)题解:我们可以二分答案 那么问题就转换为 在t的时间内军队能否控所有点显然一支军队在到根节点之前 如果能继续向上走 那么这支军队能控制的点就会更多维护bo[i]表示 从该点到所有该点子树的叶子节点路径上是否都有军队对于每个不能走到根节点的军队 就让他尽量向上走 直到不能走为止 将该点的bo值赋为1然后可以用拓扑算出bo数组这样 根节点的所有儿子中bo为1的点就不用管 而剩下的点就需要派能走到根节点的军队到
阅读全文
摘要:题意:给n个点的海拔h[i](不同点海拔不同) 两点的距离为abs(h[i]-h[j]) 有a、b两人轮流开车(只能往下标大的地方开) a每次会开到里当前点第二近的点 b每次会开到离当前点最近的点(距离相同h小的近) 给定x 如果a或b继续开距离和会大于x就不继续开。求两个问题1、给定x=x0求从哪点开始开能使a开的距离:b开的距离最小 不值相同取海拔高的2、给出m个询问 每个询问给定x1、y1 求从x1开始走且x=y1 a能走的距离和b能走的距离题解:不难发现(其实我一开始没发现 看了题解才知道TAT)从固定某点i走到的后若干个点和x没关系我们可以预处理出从i点走j个点 a、b走的距离 由于
阅读全文
摘要:刷了一星期+的ac自动机的题目 做一个总结~我的ac自动机是之前省选的时候看老师给的一个网页上学的 由于找不到原文 就贴个转载的地址吧 - -http://hi.baidu.com/winterlegend/item/d23a21ef3cdd9ff0e0a5d4d0再贴个我刷的题目目录 是notonlysuccess写的博客里的题目http://www.notonlysuccess.com/index.php/aho-corasick-automaton/我感觉ac自动机并没有学之前想的那么复杂 只是一个字典树加上一些fail指针 在维护一些要求的东西就好了fail指针的意思i就是从根节点到该
阅读全文