快速幂/乘算法

快速幂算法

通常情况下,如果要求一个数的平方,例如$a^{n}$,我们通常会想到n个a相乘来得到结果,它的复杂度为O(n),为线性的复杂度,这种算法效率较低,那么我们有没有其他的算法呢?答案是肯定有的。接下来就介绍快速幂算法。
我们都学习过二进制与十进制的转换,知道一个进制数的值可以表示为各个数位的值与权值之积的总和,假设我们要求$a^{11}$,可以将$a^{11}$中的11转换为$2^{k}=11$,再把11转换为二进制,也就是1011。二进制从最右边开始为第0位,向左依次为第1、第2位…如果一个二进制序列有m位,那么每个位对应的数值就是$2^{m-1}$,权值就是0或1。
接下来,我们回到11的二进制1011,将他转换为10进制,那就是$2^{0}×1+2^{1}×1+2^{2}×0+2^{3}×1$=1+2+0+8=11
所以$a^{11}$就可以转换为$a^{1+2+0+8}$=$a×a^{2}×a^{0}×a^{8}$,这样就可通过位操作符快速计算乘方,其复杂度为O(logn)
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
long long ksm(long long a,long long b)
{
int ans = 1,base = a;
while(b != 0){
if(b & 1 != 0){
ans *= base;
}
base *= base;
b >>= 1;
}
return ans;
}

其中b & 1 != 0用来判断当前权值是否为非0,非0说明权值为1,则继续执行代码。
ans *= base用来实现1×$a^{1}×a^{2}×a^{4}×a^{8}…$
base *=base可以实现$a^{1}、a^{2}、a^{4}、a^{8}…$
b >>=1二进制序列向右移动一位,删除最低一位。
while(b != 0) 当b的二进制序列都不为0时,执行代码。

Conic Seaction


        

Conic Section

椭圆的两个焦点F1、F2在x轴上,椭圆上有一动点P。
当点P坐标为(0,b)时
连接F1P、F2P
$OP^{2}$+$OF1^{2}$=$F1P^{2}$
$OP^{2}$+$OF2^{2}$=$F2P^{2}$
因为|PF1|+|PF2|=2a
PF1=PF2
所以|PF1|+|PF1|=2a
2|PF1|=2a
|PF1|=a
所以$a^{2}$=$PF1^{2}$
$a^{2}$=$OP^{2}$+$OF1^{2}$
$a^{2}$=$b^{2}$+$c^{2}$

GNU

GNU简介

GNU是一个自由的操作系统,其内容软件完全以GPL方式发布。这个操作系统是GNU计划的主要目标,名称来自GNU’s Not Unix!的递归缩写,因为GNU的设计类似Unix,但它不包含具著作权的Unix代码。
该系统的基本组成包括GNU编译器套装(GCC)、GNU的C库(glibc)、以及GNU核心工具组(coreutils),另外也是GNU除错器(GDB)、GNU二进制实用程序(binutils)的GNU Cashshell中和GNOME桌面环境。GNU开发人员已经向GNU应用程序和工具的Linux移植,现在也广泛应用在其它操作系统中使用,如BSD变体的Solaris,和OS X作出了贡献。

GCC&G++


gcc and g++分别是GNU的c & c++编译器。

gcc/g++在执行编译的时候一般有下面4步:


⒈预处理,生成.i的文件[预处理器cpp]

⒉将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs]。

⒊由汇编变为目标代码(机器代码)生成.o的文件[汇编器as]。

⒋连接目标代码,生成可执行程序[链接器ld]。

GCC/G++的区别

G++&GCC 在编译不同类型文件时会有所不同.
GCC在编译.c文件时会视其为.c文件,编译.cpp文件时,视其为.cpp文件。
G++在编译.c和.cpp文件时都视其为.cpp文件。

但要注意的是,GCC在编译.cpp文件时并不会自动调用链接c++的库,你需要手动链接,命令如下:
gcc -l stdc++ hello.cpp

常用命令

-c
只执行预处理、编译、汇编,也就是把程序做成obj文件,后缀名为.o
gcc -c hello.c

-S
注意,这里是大写S,只执行预处理和编译,也就是把文件编译成汇编代码,生成后缀名为.s的汇编代码。
gcc -S hello.c

-o
制定目标名称,默认的时候,GCC编译出来的文件是a.out,如果不喜欢,可以蹂躏它,使用方法如下:
gcc -o hello.cxk hello.c

最后这个命令无任何参数,直接生成a.out
gcc hello.c

要执行生成的程序,使用如下命令
./a.out

Linux下使用GCC/G++

使用以下命令即可安装:
sudo apt-get install gcc————安装GCC
sudo apt-get install g++————安装G++

使用touch命令生成一个名为test.cpp的文件
touch test.cpp
之后使用vim编辑该文件
vim test.cpp
输入i进入编辑模式,输入以下代码:

1
2
3
4
5
6
7
#include<iostream>
using namespace std;
int main()
{
cout<<"Successful"<<endl;
return 0;
}

按ESC键,然后输入 “ :wq“即可保存退出。
最后编译生成并执行文件

1
2
g++ test.cpp
./a.out

successfulimg

Motivation time:

读书是易事,思索是难事,但两者缺一,便全无用处——富兰克林

真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家——巴尔扎克

Next Function settings

Hexo的安装

环境部署

安装hexo之前,必须确保电脑已经安装以下程序:

  • Git
  • Node.js

如果已经安装以上程序,则使用以下命令安装hexo:
npm install -g hexo-cli
安装成功后,在你的电脑建立一个站点目录,用来存储hexo的相关文件,在本示例中,我们以blog为站点目录。

进入blog目录,使用以下命令初始化该目录:
hexo init
初始化完成后,使用浏览器进入http://localhost:4000,如果成功,则会看到如下页面:

hexoImg

部署到github/coding

部署到github

首先,打开自己的Github页面,new一个新的仓库,仓库名的格式必须username.github.io,点击Create repository,即可创建。

接下来,打开blog目录下的_config.yml文件,划到文本最后找到deploy字段,修改参数:

1
2
3
deploy:
type: git
repo: 这里填写刚刚创建的仓库的ssh链接

Ctrl+S保存并关闭文件,然后使用以下命令创建一个ssh key,一路回车:
ssh-keygen -t rsa -C "youremail@example.com"

这时候它会告诉你.ssh文件夹已经生成,进入该文件夹,打开id_rsa.pub.
之后在Github的setting中,找到SSH keys选项,点击New SSH key,把你id_rsa.pub中的所有信息复制进去。
完成上述操作后,在gitbash中,执行以下命令:

1
2
git config --global user.name "yourname"
git config --global user.email "youremail"

这两条命令用来设置你本地的用户名和邮箱,github通过这些本地信息来判断你的计算机是否是要找的用户。
运行以下命令来查看是否成功:
ssh -T git@github.com

这个时候需要先安装hexo-deploy-git ,也就是部署的命令,这样你才能用命令部署到GitHub,命令如下:
npm install hexo-deployer-git --save

胜利就在前方!

在gitbash中输入以下三个命令:
hexo clean —————清理站点目录下的缓存
hexo g —————生成静态文件
hexo d —————立即部署到github

然后在浏览器输入网址 username.github.io
如果出现以下页面,你就成功了!(日期可以随意修改)
hexoImg

Motivation time:

黎明前的时分是最黑暗的———富勒

胜利是不会向我走来的,我必须自己走向胜利———穆尔

  • © 2015-2019 VicenteSWL
  • Hexo Theme Ayer by shenyu
    • PV:
    • UV: