ACM算法整理

纯纯小白,把自己学过的一些算法整理一下

取模法则

  1. (a + b) % p = (a % p + b % p) % p
  2. (a - b) % p = (a % p - b % p) % p
  3. (a * b) % p = (a % p * b % p) % p
  4. a ^ b % p = ((a % p)^b) % p

快速幂算法

原理

原理就是把复杂的次幂和乘法的运算给转换成为二进制

然后在二进制上进行操作,可以减少运算的次数,然后可以算出

次幂更高的结果

时间复杂度

O(log2(n))

代码实现

#include<bits/stdc++.h>
using namespace std;
int qpow(int a,int b)
{int ans=1;while(b){if(b&1)//判断b这个数的末尾是奇数还是偶数ans*=a;a=a*a;//因为二进制数每一个一次是乘方的递增关系b>>=1;//b的二进制位右移动一位//就是把我们刚才判断b完事的二进制位去掉}//因为我们的本质就是把他的次幂变成二进制//然后我们就会对这个二进制进行操作,每个二进制乘以他的这个底数//这样就是实现了一个快速的操作,只操作了这个的二进制位数//1e9以内应该不会超过32次,不算a的自乘//但是a的值最好不要太大,不然a*a的这一步会炸掉return ans;
}
int main()
{int a,b;cin>>a>>b;//a是底数,b是次幂cout<<qpow(a,b)<<endl;return 0;
}

快速幂的取模算法

#include<bits/stdc++.h>
using namespace std;
int qpow(int a,int b,int mod)
{int ans=1;a=a%mod;while(b){if(b&1)ans=(ans*a)%mod;//ans=(ans%mod*a%mod)%mod;b>>=1;a=(a*a)%mod;//a=a%mod*a%mod%mod}
}
int main()
{int a,b,c;cin>>a>>b>>c;cout<<qpow(a,b,c)<<endl;return 0;
}

疑问

在我学习快速幂的时候翻找博客,发现了一个事情,就是所有的快速幂取模的模板,都是跟我上述的模板一致,然后我根据取模法则推导出来了我注释里面的代码,因为我觉得在极端的情况下,他会爆,但是我注释里面的代码多次取模会不会影响速度(取模的本质是试除法,会慢)

如果有师傅明白这一点,请给我讲讲,我不太懂

二进制枚举

原理

其实这个算法我想了很久,究竟什么是二进制枚举,首先我们这么分析,比如有n个东西,你每个东西都有两个选项,一个是选,另一个是不选,那么我们究竟有多少种情况

这个就是涉及到了一个数学就是他的子集有多少个

那我们就很好的可以去运算

然后咱们上个代码,咱们码上讲

#include<bits/stdc++.h>
using namespace std;int main()
{int n;cin>>n;for(int i=0;i<(1<<n);i++)/*首先这步是枚举了所有的情况这时候我当时是一头雾水什么是所有的情况啊咱们这个去思考这个问题如果有n个数,每个数我们有两种操作,选或不选然后咱们一共会有多少种操作是不是2^n次方种所以我们把这些种情况全部都给模拟一遍这时候第二个问题出现了,我们为什么从0开始要小于1<<n呢?首先0的时候他就是所有的情况都不选择然后如果我们所有的数都选了假设我们有三个数都选了二进制数就是111111的值恰好就是(1<<3)-1所以我们是小于这个数字减一这个就是第一层循环的意义*/{for(int j=0;j<n;j++)/*第二层循环为什么也是从零开始,然后小于n呢?一开始的我也是一头雾水然后咱们这么想如果我们的j是从1开始的那么我们是不是底下的1<<j就是直接从10开始的呢?所以第一位从0开始的原因就是因为我们得让他先有一个第一位然后那为什么要小于n呢?不是小于等于呢?然后我们这么理解它假设还是上面的那个例子,n等于3的时候,我们一顿操作二进制位有三个,如果我们是小于等于n的话那么我们1<<j最后是等于1000的比我们的二进制位还多了一个*/{if(i&(1<<j))/*这步有一个很重要的事情就是我们这个找的是i这个数的二进制的第j位是否为一,因为在我们前面的时候就说了,1代表选0代表不选,然后我们的1<<j里面只有一个是1,然后我们j=0就是判断的第一位是不是1有没有被选中,然后第一位的值我们可以自己去写自己需要的,然后这样j循环了n次(这里循环虽然是小于了n但是注意我们是从零开始的,所以我们的话实际是循环了n次)这样我们就是把一个二进制数的所有位都判断了一遍,就是知道了这个位置有没有被用过,我们需不需要去选择这个位置所代表的值这样把所有的情况跑了一遍,我们就起飞了,就枚举了所有的情况了*/{cout<<j<<" ";}}cout<<endl;}return 0;
}

但是吧我感觉这个的时间复杂度有点高啊

STL

vector

#include<bits/stdc++.h>
using namespace std;int main()
{vector<int>G;//声明的操作vector<int>::iterator it;G.push_back(11);//插入的操作G.push_back(11);G.push_back(12);G.push_back(13);cout<<G[0]<<endl;    //访问,但是注意了vector的插入的第一个元素是G[0]for(it=G.begin(); it!=G.end(); it++){if(*it==11)it=G.erase(it);}for(it=G.begin(); it!=G.end(); it++)cout<<*it<<" ";cout<<endl;//11 12 13for(it=G.begin(); it!=G.end();){if(*it==11)it=G.erase(it);elseit++;}for(it=G.begin(); it!=G.end(); it++)cout<<*it<<" ";//12 13it=G.begin();G.insert(it,8);//在最前面插入新元素for(it=G.begin(); it!=G.end(); it++)cout<<*it<<" ";cout<<endl;//8 12 13G.insert(G.begin()+2,1);//在迭代器中下标为3的元素前插入新元素//8 12 1 13for(it=G.begin(); it!=G.end(); it++)cout<<*it<<" ";cout<<endl;G.insert(G.end(),3);//在向量末尾追加新元素for(it=G.begin(); it!=G.end(); it++)cout<<*it<<" ";cout<<endl;//8 12 1 13 3G.insert(G.end(),3,0);//在尾部插入3个0for(it=G.begin(); it!=G.end(); it++)cout<<*it<<" ";cout<<endl;//8 12 1 13 3 0 0 0G.pop_back();//删除最后一个元素for(it=G.begin();it!=G.end();it++)cout<<*it<<" ";cout<<endl;//8 12 1 13 3 0 0vector<int>::iterator kk;kk=G.begin();G.erase(kk);//博客说:这个时候这个kk的迭代器就失效了,但是我的编译器运行的时候没有报错cout<<*kk<<endl;//12G.erase(kk);cout<<*kk<<endl;for(it=G.begin();it!=G.end();it++)cout<<*it<<" ";cout<<endl;G.erase(G.begin(),G.end());if(G.empty())//判断是否为空,为空的话返回true否则返回false{cout<<G.size()<<endl;//返回的是名为G的vector中元素的个数}G.clear();//删除名为G的vector中的所有元素return 0;
}

疑问

查询博客说,在我删除一个迭代器的时候,那个迭代器就已经失效了,但是事实上,我仍然对2这个迭代器进行了操作,迭代器依然可以正常输入输出,并且迭代器自动指向了下一位,然后我再次删除迭代器,删除的就是下一位的元素了

如果有师傅明白,还请教教我,这个我有点懵

ACM 基础知识(更新中)相关推荐

  1. iptables的基础知识-iptables中的状态检测

    2019独角兽企业重金招聘Python工程师标准>>> iptables的基础知识-iptables中的状态检测:iptabels被认为是Linux中实现包过滤功能的第四代应用程序. ...

  2. 计算机专业基础知识(中)

    大纲 分专题讲解 4. 操作系统的基本概念.功能.组成及分类 概念理解 主要功能 组成和分类 主流的操作系统 推荐书籍和课程 5. Windows 操作系统的基本概念和常用术语,文件.文件夹.库等 W ...

  3. web---基础知识(更新中)

    常用编辑器:DreamWeaver.Visual Studio Code 基础知识 HTTP协议(超文本传输协议) B/S模式(浏览器/服务器) C/S模式(客户机/服务器) World Wide W ...

  4. 损耗的基础知识(中)

    书接前文,讲了损耗的基础知识,还有相关损耗方面的知识需要补充. 1.衰减 当信号沿传输线传播时,损耗对信号的主要影响就是使信号幅度衰减. 关于衰减,记住下面的公式 若功率加倍,则分贝值变化为10log ...

  5. ACM基础知识及算法

    ACM 算法   难度 数据结构 栈 栈     1 单调栈       队列 一般队列     1 优先队列/单调队列     1 循环队列     2 双端队列     2 链表 一般链表     ...

  6. java定义一个eat方法_小黄鸭系列java基础知识 | java中的方法

    前言 今天我们要探讨的问题,是java基础语法的最后一个问题,也就是java中的方法,今天主要从以下几个方面来介绍: 方法是什么(定义) 方法的分类 方法的调用 应该说,学完今天的知识,你至少应该看懂 ...

  7. java中 hashmap中小数,java基础知识--HashMap中对 h(length-1)的理解

    1.HashMap 数组下标计算方式: (h 是k的hashcode值:length是数组长度,HashMap数组默认长度是16) 2.&是什么意思? &在 java 中做与运算,&a ...

  8. 计算机基础知识187,中职计算机基础 (187)(11页)-原创力文档

    沟通协调类 一.答题原则 1.心态 (领导都是好的.同事都是好的) 例 1:领导把你从热门部门调到了冷门部门,你怎么想? 我会欣然接受,大家认为的冷门部门,可能是是部门的工作受公众关注的机 会少或者是 ...

  9. php 类名 属性6,php基础知识(类中属性和方法练习)--2018年9月6日14:01:15

    实例 echo " 类的申明与实例化 "; class test1 { public function hello(){ return "我是一个类"; } } ...

最新文章

  1. Matlab与线性代数 -- 逆矩阵
  2. 幸福村站——成都传智播客程序猿写出你的烧烤代码
  3. 【鸿蒙 HarmonyOS】创建 Java 语言 HarmonyOS 手机应用 ( 首次进入 DevEco Studio 配置环境 | 创建 Java 手机工程 | 鸿蒙工程代码目录简介 )
  4. appium java 点击坐标_appium定位元素java篇【转】
  5. linux查找替换grep以及正则表达式
  6. MySQL中cast()与convert()的用法
  7. Git(5)-- 获取 Git 仓库(git init 和 git clone命令)
  8. python处理rgb_如何读取Python中给定像素的RGB值?
  9. 文件删不掉文件夹请求的安全信息不可用或无法显示怎么办
  10. 如何区分精确率(precision)、准确率(accuracy)和召回率(recall)
  11. Alios things学习——helloworld
  12. 易基因技术推介|高通量单细胞甲基化测序技术介绍(sc-RBS)
  13. k8s添加pod,k8常用命令,k8s删除pod
  14. 在商城项目开发中怎么保证促销商品不会超卖
  15. Github上收集了70个微信小程序源码
  16. js判断true和false
  17. 云小朵软件内测分发测试平台说明文档
  18. 第十一次ScrumMeeting博客
  19. Python数据分析(四) —— 绘制横竖条形图
  20. praat对音频文件进行标注

热门文章

  1. 算法分析:在象棋算式里,不同的棋子代表不同的数,有以下算式,设计一个算法求这些棋子各代表哪些数字。
  2. C++ STL 之stack
  3. CSS 单行/多行文本溢出显示省略号(...)的实现
  4. 线性和非线性方程数值解法_数值分析计算方法
  5. 微信支付服务商点金计划
  6. 校园二手物品商城交易平台
  7. 【一致性仿真】Group-Bipartite Consensus in the Networks With Cooperative-Competitive Interactions
  8. 刚子扯谈:一个调皮小子也能鼓捣教育?
  9. 解决STM32 硬件IIC死锁在BUSY状态的方法讨论
  10. 在C:\Windows\Fonts下复制自己的字体