高精度算法

  • 大数的存储

    • 思路大概就是把数以字符串的形式读入,然后将它们一位一位倒叙存进一个整形数组。
  • 高精度加法
    • 把每一位相加,若有进位就将下一位加一。
  • 高精度乘法
    与高精度加法类似。
  • 示例代码
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int input(string &s,int a[],int &len){cin>>s;len=s.length();for(int i=0;i<len;i++){a[i]=s[len-i-1]-'0';}return len;
}
int plus_(int a[],int b[],int lena,int lenb,int c[]){//O(n)int lenc=0;while(lenc<lena||lenc<lenb){c[lenc]=a[lenc]+b[lenc];if(c[lenc]>=10){c[lenc]-=10;c[lenc+1]++;}lenc++;}if(c[lenc]==0){lenc--;}return lenc;
}
int time_(int a[],int b[],int lena,int lenb,int c[]){//O(n^2)int lenc;for(int i=0;i<lenb;i++){for(int j=0;j<lena;j++){c[i+j]+=a[j]*b[i];lenc=i+j;}}lenc+=20;for(int i=0;i<2000;i++){c[i+1]+=c[i]/10;c[i]%=10;}while(c[lenc]==0){lenc--;}return lenc;
}
int main(){int a[2000],lena,b[2000],lenb,c[2000],lenc;memset(a,0,sizeof(a));memset(b,0,sizeof(a));memset(c,0,sizeof(a));input(s1,a,lena);input(s2,b,lenb);lenc=time_(a,b,lena,lenb,c);for(int i=lenc;i>=0;i--){cout<<c[i];}cout<<endl; memset(c,0,sizeof(c));lenc=plus_(a,b,lena,lenb,c);for(int i=lenc;i>=0;i--){cout<<c[i];}
}

快速幂

  • abmodc;a,b,c≤109a^bmodc;a,b,c\le 10^9abmodc;a,b,c≤109
  • 代码见Day1

进制转换

  • 从10进制转其他进制
  • 代码:
#include<bits/stdc++.h>
using namespace std;
char s[100];
int tot;
int main(){int a[20000];int b=121;int tobase=2;cin>>b>>tobase;while(b>0){a[tot++]=b%tobase;b/=tobase;}for(int i=tot-1;i>=0;i--){printf("%d",a[i]);}return 0;
}
  • 从其它进制转10进制
  • 代码:
#include<bits/stdc++.h>
using namespace std;
char s[100];
int main(){int base;cin>>base;scanf("%s",s);int x=1;int num=0;int l=strlen(s);for(int i=l-1;i>=0;i--){int a = s[i]-'0';if(a>=base){cout<<"Error!";return 0;}num += a*x;x *= base;}cout<<num;return 0;
}

素数

  • 大于一且因数只有1和它本身。
  • 算数基本定理
    • 任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1a1×P2a2×P3a3×......×PnanN=P_1^{a_1}\times P_2^{a_2}\times P_3^{a_3}\times ......\times P_n^{a_n}N=P1a1​​×P2a2​​×P3a3​​×......×Pnan​​,这里P1&lt;P2&lt;P3......&lt;PnP_1&lt;P_2&lt;P_3......&lt;P_nP1​<P2​<P3​......<Pn​均为质数,其中指数aia_iai​是正整数。
  • 判断一个数是不是素数
  • 一般算法
    #include<bits/stdc++.h>
    using namespace std;
    bool is_prime(int x){for(int i=2;i*i<=x;i++){if(x%i==0) return 0;}return 1;
    }
    int main(){int n;cin>>n;cout<<is_prime(i);return 0;
    }
    
  • O(nloglogn)O(nloglogn)O(nloglogn)算法
    #include<bits/stdc++.h>
    using namespace std;
    bool a[100000005];
    int x[100000005];
    int find_prime(int n){int tot=0;for(int i=2;i<=n;i++){if(!a[i]){x[tot++]=i;for(int j=2;j*i<=n;j++){a[j*i]=1;}}}return tot;
    }
    int main(){int len=find_prime(100000);for(int i=0;i<len;i++){cout<<x[i]<<" ";}return 0;
    }
    

gcd/lcm

  • gcd:最大公约数
  • lcm:最小公倍数
  • (a,b)[a,b]=ab(a,b)[a,b]=ab(a,b)[a,b]=ab

gcd

  • gcd(a,b)=p1min(a1,b1)×p2min(a2,b2)×...×pnmin(an,bn)gcd(a,b)=p_1^{min(a_1,b_1)}\times p_2^{min(a_2,b_2)}\times ...\times p_n^{min(a_n,b_n)}gcd(a,b)=p1min(a1​,b1​)​×p2min(a2​,b2​)​×...×pnmin(an​,bn​)​
  • 怎么算?
  • 辗转相减 gcd(a,b)=gcd(b,a−b)gcd(a,b) = gcd(b,a-b)gcd(a,b)=gcd(b,a−b)
  • 辗转相除法 gcd(a,b)=gcd(b,a%b)gcd(a,b) = gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)
  • 代码如下:
    int gcd(int a,int b){if(b==0) return a;return gcd(b,a%b);
    }
    

lcm

  • lcm(a,b)=p1max(a1,b1)×p2max(a2,b2)×...×pnmax(an,bn)lcm(a,b)=p_1^{max(a_1,b_1)}\times p_2^{max(a_2,b_2)}\times ...\times p_n^{max(a_n,b_n)}lcm(a,b)=p1max(a1​,b1​)​×p2max(a2​,b2​)​×...×pnmax(an​,bn​)​
  • 代码如下:
    int lcm(int a,int b){return a*b/gcd(a,b);
    }
    

示例代码

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){if(b==0) return a;return gcd(b,a%b);
}
int lcm(int a,int b){return a*b/gcd(a,b);
}
int main(){cout<<gcd(3,4)<<endl;cout<<lcm(3,4);return 0;
}

裴蜀定理

  • gcd(a,b)=d⇒ax+by=dgcd(a,b)=d\Rightarrow ax+by=dgcd(a,b)=d⇒ax+by=d
  • gcd(a,b)=1⇐⇒ax+by=1gcd(a,b)=1\Leftarrow\Rightarrow ax+by=1gcd(a,b)=1⇐⇒ax+by=1

清北学堂noip2018集训D3相关推荐

  1. 清北学堂----北京集训

    7月16日 集训第一天,毛晗杨给我们讲的基础算法和数论.基础算法讲了分块和三分等知识点,分块之前接触过,个人认为和莫队有一定的相似之处,都是把整个数组分为一个个大小相等的块,然后对块进行操作,每个块大 ...

  2. 清北学堂noip2019集训D6——动态规划

    状态压缩DP 最短哈密顿回路问题 给定一个完全图,带正边权w(u,v)w(u,v)w(u,v).求出一个顶点的排列v1,v2,...,vnv_1,v_2,...,v_nv1​,v2​,...,vn​, ...

  3. 清北学堂noip2019集训D2——数据结构

    基本数据结构 栈 STL:stack 定义:stack a; 查询堆顶:a.top(); 压入栈顶:a.pop(); 查询a中的元素个数:a.size(); 清空只能慢慢pop. 例题1 给定一个栈, ...

  4. 清北NOIP训练营集训笔记——图论(提高组精英班)

    清北NOIP训练营集训笔记--图论(提高组精英班) 本文摘自清北学堂内部图论笔记,作者为潘恺璠,来自柳铁一中曾参加过清北训练营提高组精英班,笔记非常详细,特分享给大家!更多信息学资源关注微信订阅号no ...

  5. 2020清北学堂秋季营感想——Hoarfrost

    2020清北学堂秋季营感想 前言:九月三十日放假以后,就马不停蹄地开始了这一次的奥赛培训.原先参加过暑假的提高组腾飞营,当时第一场模拟赛拿了第一,便觉得CSP的题目难度不会很高,普及+/提高-左右的难 ...

  6. 2017国庆 济南清北学堂 8天乐

    Day 0 想吐槽济南的堵车 大约接近4点从莱芜走的,走高速一个多小时,5点左右就到了济南,但是因为济南的堵车,下班高峰期,用了两个多小时才到了我们的目的地.好不容易到宾馆登记了,mc还要我们开会,8 ...

  7. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream> #i ...

  8. 清北学堂 2017-10-07

    ********今天得了在清北的最高分,有点开心wwwww,mjy爱您! 树  [问题背景]  zhx 是二叉查找树大师.  [问题描述]  二叉查找树是一种特殊的二叉树(每个节点最多只有两个儿子的树 ...

  9. 【十一日记】 清北学堂酱油记

    Day 0 五点起床 困~ 喜闻乐见的六点集合 嗯我们出发的时候迟到了四分钟( 06:26 第一次出去怎么多人 啧啧啧 @57的熊孩子们好多啊qwq 十分钟到一中 果然老司机233 嗯 目睹他们放学吃 ...

  10. 2017清北学堂(提高组精英班)集训笔记——基础算法

    我这更新笔记的顺序有点乱时间也很乱,见谅,(其实我是想偷懒什么简单先更什么O(∩_∩)O~) 一.倍增算法: 定义:用f[i][j]表示从i位置出发的2j个位置的信息综合(状态) 一个小小的问题:为什 ...

最新文章

  1. 树莓派视觉小车 -- OpenCV巡线(HSL色彩空间、PID)
  2. 等号赋值与memcpy的效率问题
  3. pytorch 多GPU训练
  4. Springboot与抓拍系统对接实现查询违章数据与预览抓拍照片
  5. 游戏的数值系统的实现和演化
  6. vue实现多行数据提交_(Vue起步)3.Vue设计模式:MVVM模式
  7. ​软件推荐:17 款必备Chrome浏览器插件,值得一试!
  8. 2021年Q2全球智能手机销量小米升至第二,苹果降至第三
  9. 【zookeeper】Zk创建空节点 不带数据的
  10. Google发布全球首个72量子比特处理器Bristlecone预览
  11. ANDROID 获得地理位置
  12. 出场顺序很重要下一句_孩子爱不爱你,出场顺序很重要
  13. 电大考计算机和英语,2016年电大+年电大计算机_英语_网考小抄.doc
  14. STL容器:list双向链表学习
  15. 触发器 索引视图 游标 事务
  16. Web前端开发技术实验与实践(第3版)储久良编著实训11
  17. 【Matlab】贝叶斯网络工具箱简介
  18. Android8-Settings-BlueTooth
  19. C盘各个文件的简单介绍
  20. nginx 配置优化的几个参数

热门文章

  1. 奋斗吧,程序员——第八章 衣带渐宽终不悔,为伊消得人憔悴
  2. python extractor_Python Extractor for Python Editor 1.2
  3. “出神”才能提高创造力——史蒂芬 · 科特勒 杰米 · 威尔
  4. U盘安装win8.1
  5. ERP软件公司选型的重要根据
  6. E4A易安卓Apost提交文本合并编码相关
  7. 电脑w ndows无法自动修复,电脑无法自动修复,开不了机怎么办
  8. 参加第2届全国高校大数据教学研讨会总结
  9. 在计算机里看不到硬盘的信息,在电脑bios里面检测不到硬盘如何解决?
  10. 安卓测试皮肤的软件有哪些,什么软件可以测肤色 有哪些检测皮肤的app好用为什么...