SPOJ MOD Power Modulo Inverted

题意

求最小的x使得A^x=B(mod C)。

思路

HDU 2815 Mod TreePOJ 3243 Clever Y完全一致,extended BSGS的模板题。

代码

 

HDU 2815 Mod Tree

题意

题目翻译好之后实际上是求解最小的x使得A^x=B(mod C)成立,C不保证是素数。

思路

典型的Extended BSGS模板题。

需要注意的是,内存空间比较紧张,HASH空间不宜开得太大,需要牺牲一些时间换空间。

代码

 

POJ 3243 Clever Y

题意

求解最小的x使得A^x=B(mod C)成立,C不保证是素数。

思路

C不保证素数的BSGS,这时使用扩展BSGS解决,扩展BSGS的实质是在BSGS之前利用这个定理:

Ad=Bd(mod C) <=> A=B(mod C/gcd(C,d))

将问题转化为一般BSGS能够解决的形式,再使用一般BSGS解决。

代码

POJ 2417 Discrete Logging这个问题中也使用了如下exBSGS的代码。

 

POJ 2417 Discrete Logging

题意

求解最小的x使得A^x=B(mod C)成立。数据保证了C一定为素数。

思路

解决这种问题是有一种特定算法Baby Step Giant Step的。BSGS算法的具体思想这里不再赘述。直接套用就可以了。

代码

 

 

HDU 1402 A * B Problem Plus

题意

实现两个大整数的加法

思路

整数加法可以看成多项式加法,然后就可以利用FFT通过进行卷积计算的方法来实现。

浮点数误差不会卡掉这个题。

代码

 

 

数学相关算法小总结

HDU5446

正确的拆乘防爆,超大素数取模,Lucas定理,CRT合并。

 

(Extended) Baby Step Giant Step Algorithm

用于求出满足A^x=B(mod C)的最小的x。

  • 参数配置:
    • HASHMOD:Hashtable的Hash空间大小,爆内存要改小
  • 调用方法:exBSGS(A,B,C);

指数循环节

若A^start = B (mod P)求出最小的len使得A^(k*len) = B (mod P),原理是这种对于一个值的循环节长度一定是Phi(P)的约数,所以不断约掉因子并尝试。

 

字符串算法小总结

Extended Knuth-Morris-Pratt Algorithm

模板

  • 参数调整:MAXN是字符串的理论最大长度
  • 调用:exKMP_getextend(char* 母串,char* 模式串),会同时处理好next数组和extend数组,数据间无需初始化。
  • exKMP_next[i]表示模式串mode[i~(len-1)]与整个模式串的最长公共前缀长度
  • exKMP_extend[i]表示母串str[i~(len-1)]于整个模式串的最长公共前缀长度

题目

HDU 4300 Clairewd’s message

Aho-Corasick Automaton

模板

  • 参数调整:
    • SP:字符集大小
    • MAXN:理论上Tire树的节点上限
    • mark():用来将字符映射到SP规定的字符集大小内的函数
    • ACA_match():需要按照题目要求更改匹配时行为
  • 调用:
    • 初始化:init()
    • 插入模式串:insert()
    • 构建fail指针:ACA_buildfail()
    • 匹配母串:ACA_match()
  • 活用注记:
    • root表示没有匹配到任何字符,如果超出字符集,也要转移到root
    • 每一个节点的fail指针对应节点是等价的更早状态(包括root状态)
    • 每个节点指向失配的出边实际上指向的是其fail指针对应状态中对应出边指向的状态

题目

[Pending]

Suffix Automaton

模板1~指针实现,动态分配内存

模板2~数组实现,支持删除后缀

 

欧拉图和哈密顿图小总结

欧拉图

概念

定义

欧拉回路:图中经过每条边一次且仅一次的环;
欧拉路径:图中经过每条边一次且仅一次的路径;
欧拉图:有至少一个欧拉回路的图;
半欧拉图:没有欧拉环,但有至少一条欧拉路径的图。

无向图判定条件

  • 图是联通的(度数为0的点不用考虑,因为是孤立的点,没影响)~先决条件
  • 所有点的度数都是偶数~存在欧拉回路,欧拉图
  • 有且仅有两个点的度数是奇数~存在欧拉路径,半欧拉图
    两个奇数度数的点一个是路径起点一个是路径终点

证明:因为任意一个点,欧拉环(或欧拉路径)从它这里进去多少次就要出来多少次,故(进去的次数+出来的次数)为偶数,又因为(进去的次数+出来的次数)=该点的度数(根据定义),所以该点的度数为偶数。

有向图判定条件

  • 把所有的边强行改为无向边之后(这个图叫原图的基图),联通~先决条件
  • 所有点出度等于入度~存在欧拉回路,欧拉图
  • 有且仅有两个点出度不等于入度,一个出度比入度大1,另一个入度比出度大1~欧拉路径,半欧拉图
    出度比入度大1的点是路径起点,入度比出度大1的点是路径终点

证明:与无向图证明类似,一个点进去多少次就要出来多少次。

模板

 

ACM Course 2 中文配套题面

Problem B(Original:POJ 3624)音乐游戏

PROBLEM DESCRIPTION

hahaschool非常喜欢玩音乐游戏,虽然他的水平差到不行,但他依然非常享受。众所周知,音乐游戏有好多种,不过作为音游狗,hahaschool显然不会去玩粗制滥造的音乐游戏(比如节操大师),也不会去摸某些打着音乐游戏旗号的音乐播放器(比如deemo)。因为hahaschool比较胖,腿部的力量和灵活性有限,所以也无法玩主要依靠腿部游玩的游戏(比如Dance Dance Revolution),同时因为hahaschool是一个害羞的男孩子,所以不会去玩要求模仿游戏里的动作的游戏(比如Dance Evolution)。即使面临诸多限制,音乐游戏千千万,在音乐游戏的世界里hahaschool总是能找到偷税(划掉)愉悦的好办法,不过因为hahaschool有选择困难症,又是一个理性派,所以每当他走进机厅,总会陷入不知道玩什么的迷茫,浪费宝贵的时间。

欢乐的时光总是短暂的,为了更好地享受音乐游戏,刚刚到达广州市区某机厅的hahaschool拜托你帮他作出选择。假设这家机厅里面有N种音乐游戏(因为机厅非常有钱,所以游戏的种类可能会多达3402种),对于第i种游戏有愉悦程度Di(1<=Di<=100),第i种游戏要投币Wi个(1<=Wi<=400),对于每种游戏,hahaschool只会玩一盘,因为这样才能享受到不同的愉悦,玩完一盘之后hahaschool就能得到游戏对应的愉悦程度。现在hahaschool的手里有M枚游戏币,因为不明原因,M可能多达12880,hahaschool并不需要花完全部的游戏币,请你算出hahaschool最多能得到多少愉悦?

INPUT

第一行:两个空格分开的整数N和M

第二行一直到第N+1行:对于第i行,会有两个有空格隔开的数Wi和Di

N,M,Wi,Di的含义及约定范围在题面中已经给出

请注意,测试数据有多组,所有的数据都会放在一个文件里,请处理到文件结束。

OUTPUT

请输出一个整数,是hahaschool在题目的约束条件之下最高能获得的愉悦程度总和,独占一行。

SAMPLE INPUT

4 6
1 4
2 6
3 12
2 7

SAMPLE OUTPUT

23

Problem C(Original:HDU 1114)壕的魔法财布

PROBLEM DESCRIPTION

众所周知gy非常壕,那么他那么多钱都是从哪里来的呢?

根据《刑法》,我们有:

第三百九十五条第一款 国家工作人员的财产、支出明显超过合法收入,差额巨大的,可以责令该国家工作人员说明来源,不能说明来源的,差额部分以非法所得论,处五年以下有期徒刑或者拘役;差额特别巨大的,处五年以上十年以下有期徒刑。财产的差额部分予以追缴。

第九十三条本法所称国家工作人员,是指国家机关中从事公务的人员。国有公司、企业、事业单位、人民团体中从事公务的人员和国家机关、国有公司、企业、事业单位委派到非国有公司、企业、事业单位、社会团体从事公务的人员,以及其他依照法律从事公务的人员,以国家工作人员论。

显然这两条并没有什么卵用,既然我们无法通过巨额财产来源不明罪威胁gy说出他如此壕的原因,我们只能雇佣专业的情报人员。

很快,我们就得到了情报,gy如此壕的秘密在于它有一个宝具“魔法财布”,每当gy需要钱的时候,他只要打开财布,里面就会掉出来金币银币各种币,然后财布会暂时性的变空。

因为gy是壕,所以跟gy跟级花约会的时候一定会买非常奢华的礼物,然而财布掉出来的钱币未必能够支付这件东西的价格,这样就会让gy显得非常没面子,所以gy必须要事先估算出财布里面最少装了多少钱,选择支付得起的最奢华的礼物,这样才能突显他的高贵。

INPUT

在评测过程中,所有的数据都是在一个文件里,请处理到文件结束。

在输入文件中包括了T组数据,在文件的开头,给出了T,独占一行。

之后,对于每组数据的第一行,是两个用空格分隔开来的整数E和F。E表示一个空的财布的重量。F表示gy拿出财布时,他感受到的财布的重量。重量的单位是克,最多10000克,毕竟gy有神力。(1<=E<=F<=10000)

在每组数据的第二行,给出了一个整数N,独占一行。表示财布可能会生成N种钱币.(1<=N<=500)

接下来是N行,每一行会有两个整数P和W,用空格分隔。P表示当前行所表示钱币的价值,W表示当前行所表示钱币的重量。(1<=P<=50000,1<=W<=10000,重量以克给出)。

OUTPUT

请输出财布中所含钱币的最小价值,独占一行。请注意,如果通过给出的钱币无法通过某种方式使财布的重量正好等于gy感受到的财布的重量,请输出-1.

SAMPLE INPUT

3
10 110
2
1 1
30 50
10 110
2
1 1
50 30
1 6
2
10 3
20 4

SAMPLE OUTPUT

60
100
-1

Scroll to top