数学问题的解题方法(模板)
查找数字规律公式的网站: http://oeis.org/A005773
C++头文件: #include <bits/stdc++>
链接: http://blog.kuoe0.tw/posts/2014/01/31/install-gnu-gcc-on-os-x-and-use-the-header-bits-stdcplusplus-h-and-policy-based-data-structure/
一个数论讲的很好的博客: http://www.cnblogs.com/linyujun/category/784324.html
辗转相除法:
1.最大公约数
1 int gcd(int a,int b){ 2 if(b==0) 3 return a; 4 return gcd(b,a%b); 5 }
1 LL gcd(LL a, LL b) 2 { 3 return b == 0? a : gcd(b, a % b); 4 } 5 6 void ex_gcd(LL a, LL b, LL& d, LL& x, LL& y) 7 { 8 if(!b) 9 { 10 d = a; 11 x = 1; 12 y = 0; 13 } 14 else 15 { 16 ex_gcd(b, a % b, d, y, x); 17 y -= x * (a/b); 18 } 19 }
2.扩展欧几里德算法
ax+by=gcd(a,b)
1 int extgcd(int a,int b,int &x,int &y){ 2 int d=a; 3 if(b!=0){ 4 d=extgcd(b,a%b,y,x); 5 y-=(a/b)*x; 6 } 7 else{ 8 x=1; 9 y=0; 10 } 11 return d; 12 }
有关素数的基础算法:
1.素数判定
1 //素性测试 2 bool prime(int n){ 3 for(int i=2; i*i<=n; i++){ 4 if(n%i==0) 5 return false; 6 } 7 return n!=1; //1是例外 8 } 9 10 //约数枚举 11 vector<int> dis(int n){ 12 vector<int> res; 13 for(int i=1; i*i<=n; i++){ 14 if(n%i==0){ 15 res.push_back(i); 16 if(i!=n/i) 17 res.push_back(n/i); 18 } 19 } 20 return res; 21 } 22 23 //整数分解 24 map<int,int> prime(int n){ 25 for(int i=2; i*i<=n; i++){ 26 while(n%i==0){ 27 ++res[i]; 28 n/=i; 29 } 30 } 31 if(n!=1) 32 res[n]=1; 33 return res; 34 }
2.埃氏筛法
1 int prime[MAX_N]; //第i个素数 2 bool is_prime[MAX_N+1] //is_prime[i]为true表示i是素数 3 4 //返回n以内素数的个数 5 int solve(int n){ 6 int p=0; 7 for(int i=0; i<=n; i++) 8 is_prime[i]=true; 9 is_prime[0]=is_prime[1]=false; 10 for(int i=2; i<=n; i++){ 11 if(is_prime[i]){ 12 prime[p++]=i; 13 for(int j=2*i; j<=n; j+=i) 14 is_prime[i]=false; 15 } 16 } 17 return p; 18 }
3. 区间筛法
1 typedef long long ll; 2 3 bool is_prime[MAX_L]; 4 bool is_prime_small[MAX_B]; 5 6 //对区间[a,b)内的整数执行筛法.is_prime[i-a] = true -- i是素数 7 void segment_sieve(ll a,ll b){ 8 for(int i=0; (ll)i*i<b; i++) 9 is_prime_small[i]=true; 10 for(int i=0; i<b-a; i++) 11 is_prime[i]=true; 12 for(int i=2; (ll)i*i<b; i++){ 13 if(is_prime_small[i]){ 14 for(int j=2*i; (ll)j*j<b; j+=i) 15 is_prime_small[j]=false; //筛[2,根号b) 16 for(ll j=max(2LL,(a+i-1)/i)*i; j<b; j+=i) 17 is_prime[j-a]=false; //筛[a,b) 18 } 19 } 20 }
模运算
1 LL qpow(LL x, LL k) 2 { 3 LL res = 1; 4 while(k) 5 { 6 if(k & 1) res = res * x % MOD; 7 x = x * x % MOD; 8 k >>= 1; 9 } 10 return res; 11 } 12 13 LL inv(LL a, LL x) 14 { 15 return qpow(a, x - 2); 16 }
凸包:
1 struct point 2 { 3 double x; 4 double y; 5 point (double x = 0, double y = 0):x(x), y(y) 6 {} 7 }; 8 typedef point Vector;//向量 9 Vector operator + (Vector A, Vector B)//向量加法 10 { 11 return Vector(A.x + B.x, A.y + B.y); 12 } 13 14 Vector operator - (Vector A, Vector B)//向量减法 15 { 16 return Vector(A.x - B.x, A.y - B.y); 17 } 18 19 Vector operator * (Vector A, double p)//向量乘法 20 { 21 return Vector(A.x * p, A.y * p); 22 } 23 24 Vector operator / (Vector A, double p)//向量除法 25 { 26 return Vector(A.x / p, A.y / p); 27 } 28 29 int dcmp(double x)//精度控制 30 { 31 if(fabs(x) < eps) return 0; 32 else 33 return x < 0? -1 : 1; 34 } 35 36 bool operator == (const point& a, const point& b)//判断点相等 37 { 38 return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0; 39 } 40 41 double Dot(Vector A, Vector B)//向量点积,A*B,垂直为0 42 { 43 return A.x * B.x + A.y * B.y; 44 } 45 46 double Length(Vector A)//向量长度 47 { 48 return sqrt(Dot(A, A)); 49 } 50 51 double Angle(Vector A, Vector B)//向量极角 52 { 53 return acos(Dot(A, B) / Length(A) / Length(B)); 54 } 55 56 double Cross(Vector A, Vector B)//向量叉乘,AXB, 有向面积的两倍 57 { 58 return A.x * B.y - A.y * B.x; 59 } 60 61 double Area2(point A, point B, point C)//两向量组成的四边形的有向面积 62 { 63 return Cross(B - A, C - A); 64 } 65 Vector Rotate(Vector A, double rad)//向量A,逆时针旋转rad°, 极角形式 66 { 67 return Vector(A.x * cos(rad) - A.y * sin(rad), A.x * sin(rad) + A.y * cos(rad)); 68 } 69 70 Vector Normal(Vector A)//A will not 0 Vector!, 求单位向量 71 { 72 double L = Length(A); 73 return Vector(A.x / L, A.y / L); 74 } 75 76 Vector GetLineIntersection(point P, Vector v, point Q, Vector w)//求两向量的交点(不求具体坐标) 77 { 78 Vector u = P - Q; 79 double t = Cross(w, u) / Cross(v, w); 80 return P + v * t; 81 } 82 83 double DistanceToLine(point P, point A, point B)// 点到直线的距离 84 { 85 Vector v1 = B - A, v2 = P - A; 86 return fabs(Cross(v1, v2)) / Length(v1); 87 } 88 89 double DistanceToSegment(point P, point A, point B)//点到线段的距离 90 { 91 if(A == B) return Length(P - A); 92 Vector v2 = P - A, v3 = P - B, v1 = B - A; 93 if(dcmp(Dot(v1, v2) < 0)) return Length(v2); 94 else if(dcmp(Dot(v1, v3)) > 0) return Length(v3); 95 else 96 return fabs(Cross(v1, v2)) / Length(v1); 97 } 98 99 point GetLineProjection(point P, point A, point B)//求点在直线上的投影 100 { 101 Vector v = B - A; 102 return A + v * (Dot(v, P - A) / Dot(v, v)); 103 } 104 105 bool SegmentProperIntersection(point a1, point a2, point b1, point b2)//两线段是否相交 106 { 107 double c1 = Cross(a2 - a1, b1 - a1); 108 double c2 = Cross(a2 - a2, b2 - a1); 109 double c3 = Cross(b2 - b1, a1 - b1); 110 double c4 = Cross(b2 - b1, a2 - b1); 111 return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0; 112 } 113 114 bool OnSegment(point P, point a1, point a2)// 点是否在线段上 115 { 116 return dcmp(Cross(a1 - P, a2 - P)) == 0 && dcmp(Dot(a1 - P, a2 - P)) < 0; 117 } 118 119 double PolygonArea(point *p, int n)// 凸多边形(多边形)的有向面积 120 { 121 double area = 0; 122 for(int i = 1; i < n - 1; i ++) 123 area += Cross(p[i] - p[0], p[i + 1] - p[0]); 124 return area / 2.0; 125 }
正多边形内接圆半径:
1 double getlen(double n,double r/){ //n正多边形边数,r正多边形边长 2 return 2.0*r*tan(pi/n); //const int PI = acos (-1.0); 3 }
中国剩余定理模板: http://blog.csdn.net/qq_32734731/article/details/51182391
数论可学习的链接: http://www.cnblogs.com/linyujun/category/784324.html
模板来自 : -> 萌哒哒~毅哥
<<挑战程序设计竞赛>>读后感......
转载于:https://www.cnblogs.com/wangmengmeng/p/5321480.html
数学问题的解题方法(模板)相关推荐
- 排队问题解题思路_高考文科数学是最“拉分”的!6种题型分析与10大解题方法...
我回来啦~~好多天没更了. 最近私信挺多的,很多人跟我说学习毫无章法,总是高投入低产出,大量的时间.精力投入,成绩却不见起色.包括当年我自己上高中的时候,也是这样. 问题其实就是上课听懂了.但是一做题 ...
- 同底数幂比较大小方法_知识体系构建:初中数学4大知识点及10大解题方法总结(干货)...
基本知识 1.数与代数 A.数与式: 1. 有理数 ■ 有理数: ①整数→正整数/0/负整数 ②分数→正分数/负分数 ■ 数轴: ①画一条水平直线,在直线上取一点表示0(原点),选取某一长度作为单位长 ...
- 数学猜想验证步骤_高中数学解题思路与技巧汇总,19种解题方法,实用!
解数学题,除了掌握有关的数学知识之外,最好掌握一定的解题技巧甚至知道点解题思想.要知道高考试题的解答过程中蕴含着重要的数学思想方法,如果能有意识地在解题过程中加以运用,势必会取得很好的效用.下面邦德华 ...
- c语言 解元二次函数的源代码,学霸强推,高中数学万能解题方法,对数学一筹莫展的你必看!...
数学不好怎么办,你有多头疼数学成绩?你还担心自己学不好数学吗?其实只要掌握学习的方法,数学就能迅速提升. 今天,小编整理了一份学霸们强推的数学解题方法,对大家肯定有帮助,数学不好的一定要看! 本文适合 ...
- 高中数学必修一函数值域解题方法
作者:vxbomath 数学,是一门重视逻辑思维的学科.在所有的科目当中,数学是一门做好拉分,也是丢分最惨的学科.很多学生数学是最难的学科,不仅需要仔细细心,还需要很强的逻辑思维能力才能够学好数学.因 ...
- 肖博高考数学二轮复习方法之圆锥曲线 解题策略附带题型解析
高考数学二轮复习方法椭圆.双曲线.抛物线是解析几何的重点,高考主要考查定义,标准方程,几何性质,直线与圆锥曲线的位置关系,有时和函数.不等式.平面向量相结合考查综合性问题.一般情况下,高考的考查难度中 ...
- 3种SAT数学解题方法介绍
SAT数学考试对于中国内地的考生来说相对比较简单,但是并不是每一个人都如此.所以掌握SAT数学解题方法就成为了必要的手段.SAT数学解题方法可以让更多的人提高SAT数学的成绩,下面就是详细内容. 1. ...
- SAT数学解题方法:逻辑推理
SAT数学考试的方式和国内不同,考察的重点也不一样,所以虽然SAT数学考试的内容,中国的考生们都已经掌握了,但是还是需要积累一些相关的SAT数学解题方法.下面就为大家介绍一个非常常用的方法,利用逻辑推 ...
- 最好用的SAT数学解题方法
SAT数学考试对中国的考生来说虽然比较简单,但是也是需要掌握一些解题方法的.下面就为大家搜集整理了一种最实用的SAT数学解题方法,应用的范围非常广泛,供大家参考,希望各大家一些借鉴. 这个最实用的SA ...
最新文章
- 从《王者荣耀》谈游戏的帧同步
- YUIDoc的使用方法小结
- html 加粗_若想学前端开发,要从HTML基本元素开始第一节
- CentOS7 64位下MySQL5.7安装与配置(YUM)
- mysql在cmd命令行下的相关操作
- PYTHON-anaconda-安装
- edu汇编语言——实训课程
- 巴菲特:伯克希尔没有所谓的5G核心能力 子公司会涉足相关行业
- 淘宝海报字体素材模板,让你的海报字体活起来!
- ElasticSearch:图解ElasticSearch的搜索过程
- JDK8-u271/u272的jre和jdk/jre的文件有差异
- wps linux版本支持vba,Wps vba安装包
- 俄罗斯方块(C/C++)
- 接口耗时优化与cpu飙高解决
- 吃透Kafka六:topic 创建过程
- windows-sys15:windows11 Android 子系统安装和apk应用安装
- so easy 的 Vue3.0自定义指令(也搜一贼)
- 第二十天: Linux文件管理+Linux备份压缩+网络与磁盘管理+shell与安装
- 微火上线ai绘画小程序搭建系统,ai绘画小程序源码触手可及
- ubuntu 进不去界面解决方案
热门文章
- 10个随机数相加等于100
- PHP下的Oauth2.0尝试 - 授权码授权(Authorization Code Grant)
- PacificA 一致性协议解读
- Mybatis底层原理学习(二):从源码角度分析一次查询操作过程
- 实现 Java 多线程并发控制框架
- bitcoin转账api,python3.7
- 动捕技术是拯救VR体验的关键,但如何落地却已成为世界难题
- PL/SQL 中文显示乱码解决方案
- Tree的实现,js开发组件dtree
- 致远互联“平台+生态”抢占数字化升级新赛