上一页 1 ··· 7 8 9 10 11 12 13 14 15 下一页
摘要: 这就是大神口中的简单题,我的数论简直烂到不行,这些数学出身的家伙何必出这些恶心的数学题来难为我们呢。。 用到一个公式 A^x%P=(A^(x%phi(P)+phi[P]))%P (x>=phi[C]),phi[C]表示欧拉函数。 注意条件是x>=phi[C],但这题的x是增长很快的,很快就能满足这个条件,所以x<phi[C]这部分暴力即可。 接着继续暴力求x%phi[C]!=0的情况,很快就会出现x%phi[C]==0,并且之后一直都会满足,题目转化为求A^phi[P]%P==b,根据鸽巢原理,一定会出现长度为P循环节,于是统计循环节内满足条件的数的个数,再乘以循环节个数,然 阅读全文
posted @ 2012-08-29 01:48 Burn_E 阅读(231) 评论(0) 推荐(0)
摘要: 很老的题了,一开始懒的写HASH写个二分查找还没过,后来改成HASH就A了。。 1 #include <stdio.h> 2 #include <string.h> 3 #define MOD 999997 4 #define PRI 199 5 typedef __int64 LL; 6 LL add=10000000000000000LL; 7 int cas,n; 8 LL d[5][201]; 9 LL num[MOD];10 int first[MOD],next[MOD/2],es;11 void ins(LL x,int p){12 num[es]=x,n 阅读全文
posted @ 2012-08-29 01:38 Burn_E 阅读(159) 评论(0) 推荐(0)
摘要: 其实是很裸的一道题,可能是因为几乎没用过扩展KMP,只想到用后缀数组,但这题的常数卡的很厉害,不用扩展KMP应该是过不了的。 扩展KMP能求出一个串所有后缀串(即s[i...len])和模式串的最长公共前缀。于是只要将这个串复制一遍,求出该串每个后缀与其本身的最长公共前缀即可,当公共前缀>=len时,显然相等,否则只要比较下一位就能确定这个串与原串的大小关系。 至于重复串的问题,只有当这个串有循环节的时候才会产生重复串,用KMP的next数组求出最小循环节,用长度除以最小循环节得到循环节个数,在将3个答案都除以循环节个数即可。 1 #include <string.h> 2 阅读全文
posted @ 2012-08-29 01:36 Burn_E 阅读(310) 评论(0) 推荐(0)
摘要: 烟囱是一个3*3的中空构造,给定烟囱的高度,问用1*1*2的砖头搭成这个烟囱有多少种方法。 首先用一个8位二进制数表示某一层的状态。枚举上下两层的状态,判断这两个状态是否可以相邻,上一层必须将下层填满,但是上层自身可以有空格。当下层为0时,上层必须为1,表示放一个竖着的矩形块,因此必须满足up_stat|low_stat=255,上层中除了竖着的砖头,都是单个或连续个横放的砖头,所以必须满足up_stat&low_stat中的连续1都是偶数个。注意循环的问题,比如0的位置是1,7位置也是1,而实际上0和7是相邻着的。 相邻层的状态会构造出一个矩阵表示转化关系,为0时代表不能相邻... 阅读全文
posted @ 2012-08-29 01:22 Burn_E 阅读(317) 评论(0) 推荐(0)
摘要: 首先能够构成正方形的两个对顶点肯定在同一条对角线上,可以想到依次处理每条对角线上的点。 对于每个点,预处理出它能到的四个方向的连续1最多有多少个,记为p_up,p_down,p_left,p_right,显然,决定某一个点向右下能延伸的多少只取决于p_down和p_right中的较小值,决定某一个点向左上能延伸到多少只取决于p_up和p_left的较小值。 对于每个点,记录它能到达的最右的x轴的绝对坐标,并记录它自身的y坐标。 统计一个点和它左上的点(在对角线上)能组成多少个正方形时,只要判断有多少个点向右能和它相交即可。比如统计5,只要记录1~4中有多少点向右能和红线交叉,显然... 阅读全文
posted @ 2012-08-29 01:03 Burn_E 阅读(331) 评论(0) 推荐(0)
摘要: 很明显的双向广搜,每次从M的方向搜3步,从G的方向搜1步,然后判断是否走到对方已经走过的格子即可。至于魔王的判断,直接用曼哈顿距离判断就可以了。 1 #include <string.h> 2 #include <stdio.h> 3 #include <queue> 4 #include <stdlib.h> 5 #define MAXN 805 6 struct pnt{ 7 int x,y; 8 pnt(){}; 9 pnt(int _x,int _y):x(_x),y(_y){}10 }gst[2],st,en,q[2][MAXN*MAX 阅读全文
posted @ 2012-08-28 10:17 Burn_E 阅读(261) 评论(0) 推荐(0)
摘要: 虽然数很大,但是这40个数的公倍数一共才4万多个。这里用到STL会方便很多,map[i]里存放了从1~i能组成的公倍数有哪些以及每个数有多少种组成方法。 预处理一遍打个表然后每次O(n)的遍历一遍,否则会超时。 #include <string.h>#include <stdio.h>#include <map>typedef __int64 LL;int n,cas;LL m,ans;std::map<LL,LL> mp[41];std::map<LL,LL>::iterator it;LL gcd(LL a,LL b){ retu 阅读全文
posted @ 2012-08-27 23:41 Burn_E 阅读(170) 评论(0) 推荐(0)
摘要: 简单线段树,开根号开几次这个数就为1了,之后再对其开根号就没有意义了。当一个区间全部为0或者1时就没有必要再去跟新这个区间了。 #include <string.h>#include <stdio.h>#include <math.h>#define lson l,m,p<<1#define rson m+1,r,p<<1|1#define calm (l+r)>>1#define MAXN 100005typedef __int64 LL;int n,q,cas=1,tu,tv,tq;LL sum[MAXN<< 阅读全文
posted @ 2012-08-27 23:35 Burn_E 阅读(143) 评论(0) 推荐(0)
摘要: 一开始看范围特别小就写搜索了。。。结果自己随便出了个4*4就过不了了。。 其实就是状态压缩DP,求哈密顿回路要多少条,只是要注意判断两点是否可以划线就可以了。 #include <stdio.h>#include <string.h>#include <algorithm>typedef __int64 LL;int n,m,tot;int mz[25],bet[25][25][25],full;int zero[16],zeros,hzero[25],lowb[65536];LL d[16][65536],ans;int cant(int st,int e 阅读全文
posted @ 2012-08-27 23:24 Burn_E 阅读(221) 评论(0) 推荐(0)
摘要: ai取值范围0~1,xi取值范围0~3,所以最后异或的结果不会超过两位二进制。所以可以用一个60位的数保存30个式子的值,然后m的范围是小于22,二分一下就可以了,4^11=4*10^6,结果存下来排个序然后二分找一下就可以了。 #include <stdio.h>#include <string.h>#include <algorithm>typedef __int64 LL;int cas,n,m,ai[35][30],si[30][4];LL ans,tmp[1<<22+2];int sum[1<<22+2];int size, 阅读全文
posted @ 2012-08-27 23:14 Burn_E 阅读(300) 评论(0) 推荐(0)
上一页 1 ··· 7 8 9 10 11 12 13 14 15 下一页