- 博客(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
475
原创 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
361
原创 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
311
原创 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
418
原创 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
235
原创 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
292
原创 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
307
原创 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
291
原创 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
255
原创 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
335
原创 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
274
原创 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
262
原创 20160321 POJ1006 Biorhythms (中国剩余定理)
题意:人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定
2016-03-22 20:40:02
317
原创 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
222
原创 20160314 数论专项
A.Prime Independence(素数筛法+最大独立集)算法还没研究明白,贴个链接。http://www.2cto.com/kf/201506/404426.htmlB.Pairs Forming LCM(素因子分解)http://blog.csdn.net/lbbbbpro029/article/details/50897669C.Sigma
2016-03-19 19:16:48
265
原创 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
502
原创 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
300
原创 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
277
原创 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
349
原创 (从头写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
248
原创 (从头做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
221
原创 (从头做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
243
原创 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
327
原创 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
453
原创 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
518
原创 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
288
原创 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
313
原创 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
268
原创 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
332
原创 HDU 1198 Farm Irrigation(DFS)
大意: 有A~K的11种地形,上面有连通的渠道,输入一种布置地形的方式,求连通的地形的数量。思路: 虽然说是考查并查集,但是个人还是比较倾向于用DFS去做...(为本人并查集用得不太好找借口...)。但是思路都是一样,首先用dir数组来标识4个方向可否连通,然后遍历图,并查集思路是将两方可连通的加入集合中,最后输出集合的数量,DFS思路是如果某方向互相连通,就继续向该方向搜索,将搜
2015-08-09 16:38:27
339
原创 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
388
原创 POJ 2492 A Bug's Life(并查集+逻辑关系)
大意:科学家假定这种虫子只存在异性繁殖,然后给出了m组繁殖的虫子,判断它们之间的关系来求是否存在同性繁殖。思路:建立关系数组s来判断其与根节点的的关系,0为同性,1为异性。判断出现同性繁殖的条件为出现一组虫子在一个集合中并且与根节点的性别关系相同,性别不同的情况为正确情况。在不同集合中时进行合并操作。TIP:判断出现同性繁殖也需要继续输入,Scenario之间有空行。#
2015-08-09 15:25:47
495
原创 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
287
原创 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
342
原创 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
291
原创 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
256
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人