数学问题(一)

1. 辗转相除法/欧几里得算法

用辗转相除法求两个整数的最大公约数。记 gcd(a,b) 为两个数a和b的最大公约数。辗转相除法的理论依据为: gcd(a, b) = gcd(b, a % b). 
    因为设t为a和b的最大公约数,则 a = mt, b = nt, m和n互斥,a = k*b + a%b, k = a/b. 那么 mt = k*nt +a%b,于是a%b可以被t整除,则t为b和a%b的公约数,设 a%b = rt. 
    t = gcd(b, a%b) <==> n 和 r 互斥 
由mt = k*nt + rt, 若 n和r不互斥,则设 n = ps, r = qs, s != 1,于是得到 m 可以被s整除,即 m和n不互斥,与之前的结论矛盾! 
因此 gcd(a, b) = gcd(b, a%b)

算法实现

int gcd(int a, int b){
    if(b == 0)
        return a;
    return gcd(b, a % b);
}

2. 扩展辗转相除法

整数a和b,最大公约数为gcd(a,b),一定有 ax + by = gcd(a, b)。如何求出x和y呢? 
     设 bx‘ + a%b*y‘ = gcd(b, a%b),根据欧几里得定理有bx‘ + a%b*y‘ = gcd(b, a%b) = gcd(a, b) = ax + by,则有bx‘ + a%b*y‘ = ax + by。 
由于 a%b = a - a / b,因此 bx‘ + (a - a/b)y‘ = ax + by,即 ay‘ + b(x‘ - a/b*y‘) = ax + by,则有 
x = y‘ 
y = x‘ - a/b*y‘ 
于是,可以在求得满足bx‘ + a%b*y‘ = gcd(b, a%b)的x‘和y‘之后再继续求出x和y,当b = 0时, x = 1, y = 0即可返回。

算法实现

//返回a和b的最大公约数,同时返回时的x和y满足 ax + by = gcd(a, b)
int extgcd(int a, int b, int& x, int& y){
    if (b == 0){
        x = 1;
        y = 0;
        return a;
    }
    int d = extgcd(b, a % b, y, x);
    y -= (a/b)*x;
    return d;
}

3. 模运算

注意在某些环境下,若a为负数,则 a%m的结果也是负数,因此若想要得到a%m在[0, m-1)范围内的值,可以使用 (m + a % m) %m。 
    a和b对m同余,可以表示为 a = b(mod m)。假设a=c(mod m), b = d(mod m),那么有以下基本规律: 
a + b = c + d(mod m) 
a - b = c - d(mod m) 
a x b = c x d(mod m)

4. 快速幂算法

求一个整数x的n次方 xn,若n表示为2进制为n=ktkt−1....k1k0(b),n=2kii1+2ki2+... 
xn=x(2ki1+2ki2+...) = x2ki1∗x2ki2∗x2ki3∗... 
于是,可以按照幂次从低到高依次计算出来x2ki,然后在n的二进制表示中若ki为1,则最后的结果需要乘以 x2ki。

long long mod_pow(long long x, long long n, long long m){
    long long res = 1;
    while(n >  0){
        if (n & 1)
            res = res * x % m;
        x = x * x % m;
        n >= 1;
    }
    return res;
}

5. 矩阵的幂

typedef vector<int> vec;
typedef vector<vec> mat;
typedef long long int ll;
const int M = 10000;

//计算 A*B
mat mul(mat& A, mat& B){
    mat C(A.size(), vec(B[0].size()));
    for(int i = 0; i < A.size(); i ++){
        for(int k = 0; k < B.size(); k ++){
            for(int j = 0; j < B[0].size(); j ++){
                C[i][j] = (C[i][j] + A[i][k]*B[k][j]) % M;
            }
        }
    }
    return C:
}
//计算A^n
mat pow(mat A, ll n){
    mat B(A.size(), vec(A.size()));
    for(int i = 0; i < A.size(); i ++){
        B[i][i] = 1;
    }
    while(n > 0){
        if (n & 1)
            B = mul(B, A);
        A = mul(A, A)
        n >= 1;
    }
    return B;
}

时间: 2024-08-09 14:44:12

数学问题(一)的相关文章

[HNOI2011]数学作业

题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, -, N 顺序连接起来得到的数.例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题. 输入输

codeforces_346A Alice and Bob(数学)

题目链接:http://codeforces.com/problemset/problem/346/A 参考链接:http://blog.csdn.net/loy_184548/article/details/50174615 感受到数学在博弈论中的强大. 考虑最后终止状态的序列-无法取出任意两个数他们的差值不存在这个序列中:那么这必定是个首项等于公差的等差序列 而这个序列是 d 2d 3d....,因此可以通过a[1] a[2] a[3] ...的最大公约数得到 然后计算有几个数没在数组中,判

UVA 10089 Repackaging 数学问题

大致题意:给出几个包裹,每个包裹都包装好了3种大小的杯子.现在要重新包装,使向量 a[1]*(s[1][1],s[1][2],s[1][3])+a[2]*(s[2][1],s[2][2],s[2][3])+.....+a[n]*(s[n][1],s[n][2],s[n][3])=(k,k,k). 就这样转化成了向量问题其中a[i]为非负整数,k为正整数. 虽然转化成了向量问题,但是三维向量和这么多变量有点棘手,所以我们可以先降维,将原等式变化成: a[1]*(s[1][2]-s[1][1],s[

图像处理中的数学原理详解17——卷积定理及其证明

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 1.4.5   卷积定理及其证明 卷积定理是傅立叶变换满足的一个重要性质.卷积定理指出,函数卷积的傅立叶变

如何入门参加数学建模竞赛

1 网上资源 1.1 数学中国 可以去数学中国网站看看,在数学建模比赛的培训这一块做得很好的机构,如果自己有点银子,可以去参加他们的网上课程.另外他们有专门的数学建模群,群里面有很好关于数学建模的资料.而且这个机构自己也举办数学建模比赛,如果有时候可以在这里组队,直接参加比赛,累积一些经验,增长见识. 1.2 数学建模视频课程,现在网络上有一些比较好的关于数学建模比赛的视频资源,可以谷歌一下 1.3 网络上的一些关于数学建模的电子书,有时候你也不知道哪本书比较适合你,所以你可以先在网上找一些电子

第三周项目4-考了语文数学的学生

下面提供了类Stu的数据成员定义,和用于测试的main函数,参考如图的运行结果,完成类的定义. /* * Copyright (c) 2015,烟台大学计算机学院 * All right reserved. * 作者:邵帅 * 文件:Demo.cpp * 完成时间:2015年03月21日 * 版本号:v1.0 */ #include<iostream> #include<string> using namespace std; class Stu { private: string

51nod 1138 连续整数的和(数学)

题目描述: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1138 给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2).例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8.如果不能写为若干个连续整数的和,则输出No Solution. Input 输入1个数N(3 <= N <= 10^9). OutPut 输出连续整数中的第1个数,如果有多

[笔记]shell编程:数学计算

在shell Script中,有好几种进行数学运算的方法,虽然有几个效果差不多,在编写程序的时候使用一种方法就够了,但是我们可能还需要学习别人的程序啊,在阅读别人的程序的时候不能不认识这些东西吧.所以,留个笔记. 一.expr 命令  --  expr 允许在命令行上处理数学表达式,但是略显拙劣. 例:$ expr 1 + 5    #注意在表达式中要有空格,如果写成1+5那么结果就不是我们想要的了. expr命令能够识别一些不同的数学和字符串操作符: 操作符 描述 arg1 | arg2 如果

hdoj 3750 Guess Game 【数学之二分】

题意:用二分法找出数学期望. 策略,二分. 求数学期望有两种方法,一:求出每一个数的概率,再与数相乘,最后把所有的乘积相加就好了. 二:数学期望总是与平均数相等,所以可以当做求平均数.(简单方便) 代码: #include <stdio.h> #include <string.h> int sum; void bi_sear(int n){ sum = 0; int temp, i, left, right, mid; for(i = 1; i <= n; i ++){ te

数学建模需掌握的知识总纲

数学建模需要掌握许多知识,这里我列出总纲: 学建模中的算法 穷举法 神经网络 模拟退火 遗传算法 图论算法 蒙特卡洛算法 所需基础知识 高等数学 线性代数(矩阵加减乘除) 概率论与数理统计(概率论,参数估计,假设检验,回归分析) 评价 AHP模型(层次分析) 模糊评价 预测 分析场景 曲线拟合 模糊预测 神经网络 灰色理论 马尔科夫链 运筹 整数规划(分支界定法) 01规划 灵敏度分析 影子价格 概率统计 排队论 主成分分析法 回归分析法 曲线拟合 图论 动态规划 网络最大流 最小费用流 最短路