由波动数列对高级语言取模的思考
波动数列题目描述观察这个数列:
$$1,3,0,2, - 1,1, - 2$$
这个数列中后一项总是比前一项增加2或者减少3。栋栋对这种数列很好奇,他想知道长度为n或为s而且后一项总是比前一项增加a或者减少b的整数数列可能有多少种呢?
输入描述输入的第一行包含四个整数n,s,a,b,含义如前面所述,其中:
$$1 \le n \le 1000, - {10^{^9}} \le s \le {10^9},1 \le a,b \le {10^6}$$
输出描述输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以 $ {10^8}{\rm{ + }}7 $ 的余数。
解题过程第一层(10分)思路考虑极限情况:
$$\eqalign{
& {\rm{x,x}} + a,x + 2a,x + 3a,...x + (n - 1)a = nx + {{n(n - 1)} \over 2}a = s \cr
& x,x - b,x - 2b,x - 3b,...x - (n - 1)b = nx - {{n(n - 1)} \over 2}b = s \cr ...
算法——数论整理
本帖持续更新这是编程算法计算加速总结
快速乘法思路假设当前计算a*b,应用二进制,将a,b中较大的一位数转化为二进制表示,例如11转化为1011,然后类比利用竖式计算乘法那样,用较小的数乘以每一位代表的2次幂,最后相加。
加速点乘法转为logn量级的乘法+加法
代码无取模1234567891011121314151617181920unsigned long long Imul(unsigned long long a, unsigned long long b){ if (a > b) { unsigned long long tmp = a; a = b; b = tmp; } unsigned long long x = 0; while (b != 0) { if ((b & 1) == 1) { x = x + a; } a = a * 2; b >>= 1; } return x;}
取模123456789101112131415161718192 ...
Linux指令操作记录
本文用来记录笔者学习OS过程中掌握的Linux指令
查看命令详细用法man (命令名)目录操作cdcd ~访问当前用户主目录 一般为/home/用户OS实测:/home/git
cd .访问当前目录(原地踏步),常常结合其他目录使用
cd /访问根目录
绝对访问cd /文件/……
相对访问cd 文件cd 文件/
测试转自os平台
lsls -a查看当前目录下包括隐藏文件的所有文件
ls -l一行呈现一个文件
treetree [选项] [目录名]更高级的ls,可视化表达目录结构
选项-a 列出全部文件(包含隐藏文件)。-d 只列出目录。
mkdirmkdir [选项] 目录名称在当前目录下创建新目录
rmdirrmdir [选项] 目录名称删除当前目录下对应名称的目录,只能是空目录
pwd查看当前目录的绝对路径
文件操作touchtouch [选项] 文件名当文件存在时更新文件的时间戳,当文件不存在时创建新文件
rmrm -r 文件递归删除目录及其内容,删除非空目录必须有此选项,否则无法删除。
rm -f 文件强制删除,不提示用户确认 ...
MIPS微系统设计注意事项
这是一篇针对计组P8的一些注意事项
写在开头如果大家是以P8课下的身份来到这个,笔者首先恭喜大家来到P8,计组实验最终回。P8,是笔者认为debug de起来最痛苦的一个Project,没有之一。这是因为P8作为板级验证的Project,是最接近硬件的一个Project,而硬件Bug一般是难以定位的。
特别是ISE十分万恶,有些不可综合的语句不会给你做出相关警报,只会一声不吭的切割掉整个CPU,然后让你的CPU上板则寄,笔者被活活折磨了好几天
因此,笔者认为出一篇注意事项的博客是很有必要的,话不多说,Here We Go!
不可综合在Verilog中,有很多语句是不可综合的,我们在P8要避免出现这种情况。
注意事项(1)不使用initial。(2)不使用#10。(3)不使用循环次数不确定的循环语句,如forever、while等。(4)不使用用户自定义原语(UDP元件)。(5)尽量使用同步方式设计电路。(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。(7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 ...
中断支持流水线CPU设计文档(Verilog)
Verilog 异常中断支持流水线CPU设计文档
CPU设计方案综述总体设计综述使用Verilog开发一个流水线CPU,总体概述如下:1.此流水线CPU为32位CPU2.此CPU为流水线设计3.此CPU支持的指令集为:{add,sub,and,or,slt,sltu,addi,andi,ori,lb,lh,lw,sb,sh,sw,mult,multu,div,divu,mfhi,mflo,mthi,mtlo,beq,bne,lui,jal,jr,nop,mtc0,mfc0,syscall}4.nop的机器码为0x00000005.该CPU支持对来自计数器和外部的中断进行处理6,该CPU支持对于部分异常进行处理,例如字不对齐,存取位置异常,溢出异常等
关键模块定义IM(外置)(1)端口说明
序号
信号名
方向
描述
1
i_inst_addr[31:0]
I
需要进行取指操作的流水级 PC(一般为 F 级)
2
i_inst_rdata[31:0]
I
i_inst_addr 对应的 32 位指令
3
reset
I
复位信号
4
clk
I
时钟信号
...
中断支持流水线CPU全自动测试思路(Verilog)
这是一篇针对计组P7的自动化测试学习
写在开头由于P7是P6的迭代开发,因此本次工作将主要体现在数据生成上,而且由于Mars的局限性,我们将编写两个测试程序(一个对拍Mars,一个对拍CPU),分别用于测试功能/异常和中断
命令行学习导出0x4180位置处的机器码1java -jar Mars.jar mc LargeText a dump 0x00004180-0x00006000 HexText handler.txt nc test.asm
在Mars中,我们是无法导出0x4180位置的机器码的,但我们可以通过命令行进行导出,上面的命令行就是以16进制导出test.asm中的0x4180-0x6000位置处的机器码,导出到handler.txt文件中。
限制Mars运行指令数1java -jar Mars.jar mc LargeText nc db lg ex me 65536 test.asm > mar.txt
在P7中,最起码对于笔者来说,是经常会将程序指引向一个死循环的,所以我们需要给Mars设置指令条数上限,这样Mars才能结束运行,否则将会一直运行。 ...
流水线设计与添加指令经验总结
这是一篇针对计组P5,P6的流水线搭建和课上添加指令的经验总结
写在开头虽然这么说有搞心态的嫌疑x,但笔者认为,P5是计组难度的分水岭,难度同时体现在课下和课上当中,课下CPU做不好,做出Bug,课上强测也过不去,而且课上加指令本来就比较难做,所以被P5卡一两回也是理所应当的,同时,P5和P6同作为流水线的开发,课上指令将具有极大的相似性,因此笔者认为,开一篇博客来分享一下笔者P5,P6流水线搭建和课上添加指令是必要的,话不多说,Here We Go!
预留扩展空间如果大家是以顺利通过P3,P4的身份来看这一篇文章的,大家就会明白,一个好的架构对于课上的帮助将有多么巨大,特别是针对于P5,P6这种千行级代码的开发,笔者这里主要说一下扩展空间的事情。
MUX的非模块化很多人在P4,包括我会这样模块化写MUX:1234567891011121314151617181920212223242526272829303132333435module MUX_4_32( input [31:0] data0, input [31:0] data1, input [31:0] ...
复杂流水线CPU全自动测试思路(Verilog)
这是一篇针对计组P6的自动化测试学习
写在开头由于P6是P5的迭代开发,因此本次工作将主要体现在数据生成上
命令行学习无需,前面的完全够用
Python实现(数据执行器)无需,照搬P5即可,具体见我的前几篇博客
数据生成器迭代思路P6指令集{add,sub,and,or,slt,sltu,addi,andi,ori,lb,lh,lw,sb,sh,sw,mult,multu,div,divu,mfhi,mflo,mthi,mtlo,beq,bne,lui,jal,jr,nop}
迭代思路整体思路等同与不等同找到同类,直接归类
没有同类,单独添加
我举个例子,or,and,slt,sltu都是cal_r类型,可以直接和P5数据生成器中的add,sub等同处理。lb,lh可以等同lw处理。sb,sh可以等同sw处理。等同的意思是,代码可以复用,规则可以复用。对于mult,div则不可以,需要新规则的限制。做完这些,大部分我们就归类完毕了,之后就是对于新规则的修修补补,维持程序正确
危险指令与安全指令要这样考虑是为了逻辑上的简便,和作为指令生成时随机范围的依据 ...
复杂流水线CPU设计文档(Verilog)
Verilog 复杂流水线CPU设计文档
CPU设计方案综述总体设计综述使用Verilog开发一个流水线CPU,总体概述如下:1.此流水线CPU为32位CPU2.此CPU为流水线设计3.此CPU支持的指令集为:{add,sub,and,or,slt,sltu,addi,andi,ori,lb,lh,lw,sb,sh,sw,mult,multu,div,divu,mfhi,mflo,mthi,mtlo,beq,bne,lui,jal,jr,nop}4.nop的机器码为0x00000005.add,sub不支持溢出
关键模块定义IM(外置)(1)端口说明
序号
信号名
方向
描述
1
i_inst_addr[31:0]
I
需要进行取指操作的流水级 PC(一般为 F 级)
2
i_inst_rdata[31:0]
I
i_inst_addr 对应的 32 位指令
3
reset
I
复位信号
4
clk
I
时钟信号
(2)功能定义
序号
功能
描述
1
取指
利用PC取出对应位置处的指令
F_PC(1)端口说明
序号
信 ...
简易流水线CPU全自动测试思路(Verilog)
这是一篇针对计组P5的自动化测试学习
写在开头如果P3,P4大家有好好的做数据生成,那么P5的数据生成的工作将主要体现在对于数据生成器的优化上,对于数据执行器则无需太大的优化。
如果大家是从P5才开始做测试,那么建议看看笔者博客中P3 P4的自动化测试,很多工作在那时就已经完成,P5的自动化将迭代开发,在本篇博客中将不再赘述。
命令行学习1java -jar Mars_perfect.jar mc CompactDataAtZero nc db test.asm > mar.txt
有小问号可能要问了,这和P4没啥区别啊这?其实区别就在于”db”,这是要求Mars执行时按延迟槽执行的指令。
Python实现(数据执行器)基础功能迭代迭代在P4的基础,我们只需要更改命令行学习中的那一条指令即可完成P5的数据执行器。
自动存储机器码在P4中笔者只是将asm文件和比较结果进行了存储,并没有保存机器码,在P5笔者建议保留机器码文件,具体原因见后。1234567dir_name_3 = 'C:\\Users\\Unicorn\\Desktop ...