自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WeRIndex

为了萌神,今天也有在好好编程吗~~

  • 博客(38)
  • 收藏
  • 关注

原创 20161005 弱校联萌10.5 H Hash Collision(二分+FFT+dp)

本来不咋爱写博客的,但是这题实在让我受益匪浅,所以记录一下。 = = 题目大意是求所有长度为n的只含大写字母的字符串按所给函数进行hash,hash值有多少对相同,结果mod1e6+3。 思路: 刚开始想到用所给的hash函数进行dp,,即记录到第i个字符hash值为j的个数用26个字母递推到第i+1个字符对应的hash值,加上dp(i,j),是但是考虑了下复杂度是O

2016-10-05 20:34:54 570

原创 20160331 UVA11806 Cheerleaders(组合数公式+容斥原理)

题意: 给一个n*m的方针,求把k个石子放在阵中并且保证4条边上都有石子有多少种情况。 思路: 用容斥原理将上下左右四条边没有的情况求出拿总数减掉即可。 #include using namespace std; const int mod=1000007; int C[510][510]; void solve() { for(int i=0;i<510;i++)

2016-03-31 19:34:58 470

原创 20160330 HDU5651 xiaoxin juju needs help(组合数公式)

题意: 随意变换所给字符串顺序,能产生多少回文串。 思路: 只有有一个或没有奇数个相同的字母的串才能产生回文串。 然后回文串的一半进行分析,多个堆进行一个长度为l/2的排列,用组合数公式求解。 #include #include using namespace std; long long C[501][501]; const int mod=1e9+7; void solve(

2016-03-31 19:28:09 406

原创 20160330 HDU1695 GCD(欧拉函数+容斥原理)

题意: 求1-b与1-d之间有多少组gcd=k的一对数。 思路: 令b=b/k,d=d/k,原题就变为了求1-b与1-d之间有多少互质的一对数。 假设b 对于[b+1,d]中,将每个数进行素因子分解,用容斥定理(酷炫的二进制)可以求出所有不互质的对数,再用总数减掉。 两部分的和即为所求。 #include #include using namespace std; long l

2016-03-31 19:23:05 505

原创 20160329 HDU2082 找单词(生成函数)

运用生成函数求对于有权值的多个堆,每个对应的权值有多少种组合方法。 #include #include using namespace std; int main() { int T; int inp[100]; long long c1[100],c2[100]; cin>>T; while(T--) { for(int i

2016-03-31 19:07:47 313

原创 20160329 HDU1521 排列组合(指数型生成函数)

指数型生成函数用于解决从n个堆中取东西进行排列的问题。 用double进行处理然后取整。 #include #include #include using namespace std; double jc(int n) { double ans=1.0; for(int i=1;i<=n;i++) ans*=i; return ans; } i

2016-03-31 19:02:16 383

原创 20160329 HDU1023 Train Problem II(卡塔兰数)

基本的卡塔兰数应用:出栈次序,括号化,凸多边形的三角划分,二叉树的构造等等。 利用递推公式h(n)=h(n-1)*(4n-2)/(n+1)求解 #include #include using namespace std; char a[101][10000]={"null","1","2","5","14","42","132","429","1430","4862","16796","

2016-03-31 18:58:34 384

原创 20160321 HDU1452 Happy 2004(快速幂)

题意: 求2004的x次方的所有因子的和,结果对29取余。 思路: 还是这个公式,2004=2^2*3*167 因此sigam(n)=(2^(2*x+1)-1)*(3^(x-1)-1)/2*(167^(x+1)-1)/166 因为167%29=22,可以结果可简化为: ans=((2^(2*x+1)-1)*(3^(x-1)-1)/2*(22^(x+1)-1)/21)%29

2016-03-22 21:27:22 395

原创 20160322 HDU5317 RGCDQ(筛数+树状数组)

题意: F(n)是n的不同素因子的个数,求在[ L,R ],区间内最大的gcd(F(i),F(j))。 思路: 可以注意得到数据范围小于1E6,意味着F(n)的取值范围很小(不会超过7)。 很容易想到记每个位置的F(n),在查询区间时返回区间内各个F(n)的个数,然后判断gcd值的方法。 用素数表将范围内所有的F(n)筛选出来,通过树状数组来求区间和。 #include #inclu

2016-03-22 21:14:50 344

原创 20160322 HDU4704 Sum(费马小定理+快速幂)

题意: s(k)为所有元素为正整数并且和为N的k阶向量的个数,求s(1)+s(2)+...s(N)的值。 大意: 可以明显的发现规律为2^(n-1)。对于大数我们可以通过费马小定理化为小于1E9+6的数,之后用快速幂求值。 这个代码乱写的,其实可以优化得更好,本来还准备用java的modpow来A结果卡了java的时间= =。 #include #include using name

2016-03-22 21:06:23 429

原创 20160321 HDU2588 GCD(欧拉函数+枚举)

题意: 求1-n内有多少x满足gcd(x,n)>=m。 思路: 枚举n的因子x,当gcd(x,n)>=m时求n/x的欧拉函数。 因为要使gcd(x*i,n)=gcd(x,n),i必须与n/x互质,这种情况有phi(n/x)种。 最后求和,即为所求结果。 #include #include using namespace std; int phi(int n) { in

2016-03-22 20:57:43 362

原创 20160321 CodeForces 7C Line(拓展欧几里得)

题意: 给你a,b,c,求在ax+by+c=0线段上的坐标为整数的点,没有输出-1. 思路: ax+by=-c符合拓展欧几里得的形式,模板走你,注意a或b为零的处理。 #include #include using namespace std; long long exgcd(long long a,long long b,long long &x,long long &y) {

2016-03-22 20:44:59 361

原创 20160321 POJ1006 Biorhythms (中国剩余定理)

题意: 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定

2016-03-22 20:40:02 422

原创 20160321 POJ2478 Farey Sequence(欧拉函数)

题意: 求分母小于等于n的所有无法约分的分数的个数。 思路: 显然有F(2)=phi(2),F(n)=F(n-1)+phi(n)。 即求2-n欧拉函数的和,模板走你。 #include #include using namespace std; long long powmod(long long a,long long i,long long n) { if(i==0)

2016-03-22 20:30:46 319

原创 20160314 数论专项

A.Prime Independence(素数筛法+最大独立集) 算法还没研究明白,贴个链接。 http://www.2cto.com/kf/201506/404426.html B.Pairs Forming LCM(素因子分解) http://blog.youkuaiyun.com/lbbbbpro029/article/details/50897669 C.Sigma

2016-03-19 19:16:48 342

原创 20160317 Uva11395 Sigma Function(素因子分解+各种公式+筛数)

题意: sigma(n)=n的所有因子之和,例如sigma(24) = 1+2+3+4+6+8+12+24=60,求1-n内有多少sigma函数的值为偶数。 思路: 从测试数据可以看出为偶数的情况比较多,所以可以反过来对奇数的情况进行讨论。 从上述公式能够看得出sigma函数的值可以通过分解n的素因子得到。 而对于上述公式可以有如下分析: 1.对于唯一的偶素数2

2016-03-17 13:29:20 716

原创 20160315 LightOJ 1236 Pairs Forming(素因子分解)

题意: long long pairsFormLCM( int n ) { long long res = 0; for( int i = 1; i <= n; i++ ) for( int j = i; j <= n; j++ ) if( lcm(i, j) == n ) res++; // lcm means least common m

2016-03-15 16:43:51 394

原创 20160315 LightOJ 1236 Pairs Forming LCM

题意:

2016-03-15 16:32:21 152

原创 20160314 POJ1061青蛙的约会(拓展欧几里得)

关于拓展欧几里得算法 运用拓展欧几里得算法,可以求出GCD(a,b),并且求出一组满足AX+BY=GCD(A,B)。 1.当B==0时,X=1,Y=0等式成立 2.当B>0时,有        BX'+(A mod B)Y'=GCD(B,A mod B)=GCD(A,B) 可以通过变形得到       AY'+B(X'-A/B*Y')=GCD(A,B) 由此可得 X=Y‘,Y=X'-

2016-03-14 16:36:08 367

原创 Codeforce 552D Vanya and Triangles(暴力枚举)

题意: 给你n个点,从中任取三个点,能组成多少个三角形。 思路: 三个点不能构成三角形的条件是在一条直线上,于是枚举所有情况,将在一条直线上的情况去除。 #include #include #include #include #include using namespace std; int x[2005],y[2005]; int v[2005]; int main() {

2015-11-05 17:39:11 451

原创 (从头写DP)HDU 1058 Humble Numbers

状态转移方程 a[i]=min(2*a[b2],3*a[b3],5*a[b5],7*a[b7]). 注意序数词的结尾。 #include #include using namespace std; int a[500005],ans[500005]; int main() { ios::sync_with_stdio(false); int n; a[1]=1;

2015-10-21 14:41:58 309

原创 (从头做DP)HDU 1025 Constructing Roads In JGShining's Kingdom

最长上升子序列的nlogn算法。 #include #include using namespace std; int a[500005],ans[500005]; int main() { ios::sync_with_stdio(false); int n,x,y,d=1; while(cin>>n) { for(int i=0;i<n;

2015-10-21 14:38:01 281

原创 (从头做DP)HDU 1003 Max Sum

#include using namespace std; int main() { int T,n,x,d=1; cin>>T; //int a[1000005]; while(T--) { cin>>n; int maxsum=-1001,sum=0,st=0,en=0,t=0; for(int i

2015-10-21 14:35:37 300

原创 HDU 5328 Problem Killer(简单DP)

大意: 输出其中最长的等差(AP)或等比(GP)数列的长度。 数列长度为1或2时一定是等比或等差数列。 如果a,b,c是AP或GP,b,c,d是AP或GP那么a,b,c,d是AP或GP。 因此有状态转移方程。#include #include #include #include #define eps 1e-6; using namespace std; int a[100000

2015-08-13 14:31:46 429

原创 HDU 1316 How Many Fibs?(二分查找+大数加法)

大意: 求[a,b]之间有多少Fib。 题解: 先用大数加法打表求出fib数列。 再用二分查找找出第一个大于等于a的位置和最后一个大于b的位置,输出下标差值。 这里我玩了一下,将表打出来以后直接放到初始化里了... #include #include #include #include #include using namespace std; char f[][120]=

2015-08-13 14:02:57 560

原创 HDU 3117 Fibonacci Numbers(斐波那契数列通项+矩阵快速幂)

大意: 8位及以下的fib直接输出,8位以上的输出XXXX(fib前四位)...XXXX(fib后四位)。 思路: 8位以下的打表输出就好了。 fib的前四位可以利用通项公式fn=1/√5/*[(1+√5)^n/2)-(1-√5)^n/2]来求,利用对数知识求解。 例如: log(2335566)=log(2.335566)+2. 那么log(2.335566)是log(233556

2015-08-13 13:31:46 632

原创 HDU 1075 What Are You Talking About(STLmap的应用)

大意: 给出几组英文和火星文的对应关系,翻译下面给出的句子。 思路: 翻译表现的是映射的关系,所以用map来记录对应关系。 TIP:可能录入多出的空行导致PE。 #include #include #include #include #include using namespace std; map word; int main() { string inp,b,a;

2015-08-11 15:44:24 346

原创 HDU 1247 Hat’s Words(字典树)

思路: 改造字典树模板,Search在访问节点时如果发现单词结尾对剩下部分进行查询,若剩下部分正好对应另一个单词就输出。 TIP: 题目说要按字典序输出,但是貌似是不用的... #include #include #include #include using namespace std; const int b='a'; const int cz=1000000; char a

2015-08-11 14:30:40 382

原创 HDU 1671 Phone List(字典树)

大意: 插入n个电话号码,如果其中有一个是另一个的前缀就输出NO。 思路 改造字典树模板,当最后一个字母插入时节点已存在或插入时该节点已标记为结尾,flag=false。 #include #include #include #include using namespace std; int ans; struct trie { int tot,root,c[100050

2015-08-11 13:38:06 325

原创 HDU 1558 Segment set(并查集+判断线段相交)

大意: 支持两种操作: P x1,y1,x2,y2  插入一条线段 Q x 输出第x条线段直接或间接与它相交的线段的数量+1(它自身)。 思路: 以此判断与之前的线段相交,如果相交就合并集合,并查集模板与判断线段相交模板水过。 TIP: 样例之间需要输出空行。 #include #include #include #include using namespace std;

2015-08-09 18:05:21 421

原创 HDU 1198 Farm Irrigation(DFS)

大意:  有A~K的11种地形,上面有连通的渠道,输入一种布置地形的方式,求连通的地形的数量。 思路:  虽然说是考查并查集,但是个人还是比较倾向于用DFS去做...(为本人并查集用得不太好找借口...)。 但是思路都是一样,首先用dir数组来标识4个方向可否连通,然后遍历图,并查集思路是将两方可连通的加入集合中,最后输出集合的数量,DFS思路是如果某方向互相连通,就继续向该方向搜索,将搜

2015-08-09 16:38:27 443

原创 POJ 1182 食物链(并查集+逻辑关系)

大意:存在三种生物A吃B, B吃C,C吃A。 有两种语句1 x y:说明x与y为同类                     2 x y:说明x吃y 根据规则来判断下面说的话存不存在假话,最后输出假话的值。 判断为假话的条件: 1) 当前的话与前面的某些真的话冲突,就是假话; 2) 当前的话中X或Y比N大,就是假话; 3) 当前的话表示X吃X,就是假话。 题意: POJ2

2015-08-09 15:41:48 470

原创 POJ 1182 食物链(并查集+逻辑关系)

大意:存在3种生物A吃B

2015-08-09 15:28:24 172

原创 POJ 2492 A Bug's Life(并查集+逻辑关系)

大意: 科学家假定这种虫子只存在异性繁殖,然后给出了m组繁殖的虫子,判断它们之间的关系来求是否存在同性繁殖。 思路: 建立关系数组s来判断其与根节点的的关系,0为同性,1为异性。 判断出现同性繁殖的条件为出现一组虫子在一个集合中并且与根节点的性别关系相同,性别不同的情况为正确情况。 在不同集合中时进行合并操作。 TIP:判断出现同性繁殖也需要继续输入,Scenario之间有空行。 #

2015-08-09 15:25:47 595

原创 POJ 1611 The Suspects(并查集)

简单的并查集问题,引入计数数组num来记录该根节点的对应的集之中的人数,刚开始时num均为1。 逐次将团体编号输入到并查集中,最后找到0的根结点,输出对应的num值。 TIP:题目数据有可能给出两个相同的集合合并,所以合并时要加上 if(a==b) return; 否则WA。 #include #include #include using namespace std; int n;

2015-08-09 15:08:55 352

原创 HDU 1394 Minimum Inversion Number(求最小逆序数)

大意: 给出0~n-1的n个数的一种排列,并且可以将第一个数字移动到最后一个形成新的排列,求这些排列的逆序数(满足iaj的数对)的最小值。 思路: 求出原排列的逆序数a之后,下一个排列的逆序数值b应该符合b=a-inp[i](移动的数字值)+n-inp[i]-1; 因为inp[i]为第一个元素时,后面必有inp[i]个比它小的数,所以减少了inp[i]个对数,而移动到最后一个的同时增加了n

2015-08-07 17:05:21 439

原创 HDU 1754 I Hate It(线段树_单点更新)

支持两种操作 Q x y    查询 [x,y]区间内的最大值。 U  x y   将x位置的点值更新为y; 线段树模板水过 #include #include #include using namespace std; const int N=200000+5; struct tree { int a[N<<2]; void push(int cur)

2015-08-07 16:08:10 361

原创 HDU 1166 敌兵布阵(树状数组)

单点更新以及查询区间和,树状数组水过。#include #include #include using namespace std; int n; int a[50005]; int lowbit(int x) { return x&(-x); } int sum(int pos) { int ans=0; while(pos>0) {

2015-08-07 15:17:28 314

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除