ACM数论中的常见的模板和结论

1:最大公约数的求法

欧几里得算法实现。递归实现

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<iostream>
 5 using namespace std;
 6 __int64 gcd(__int64 y,__int64 x)
 7 {
 8     __int64 ans=0;
 9     if(x==0)
10      ans=y;
11      else
12      ans=gcd(x,y%x);
13      return ans;
14 }
15 int main()
16 {
17     int t;
18     __int64 A,B;
19     scanf("%d",&t);
20         scanf("%I64d %I64d",&A,&B);
21         if(A>B)
22         swap(A,B);
23         printf("%I64d\n",gcd(A,B));
24     }
25     return 0;
26 }

2:最小公倍数和最大公约数的关系

设n和m的最大公约数是p,最小公倍数是q,那么有下列的关系

p*q=n*m,所以求两数的最大公约数可以转换成求求两数的最大公约数再根据两者之间的关系来求最小公倍数= =

3:素数的判定

1> 试商法

int is_prime()
{
for(int i=2;i*i<=n;i++)
{
    if(n%i==0)
    return 0;
}
return 1;
}

2>筛选法

数组a[]存的是1000000以内的素数

int get_prme()
{
    int k=0;
    for(int i=2;i<=1000000;i++)
    {
        if(!chick[i])
        a[k++]=i;
        for(int j=0;j<k;j++)
        {
            if(i*a[j]>1000000)
            break;
            chick[a[j]*i]=1;
            if(i%a[j]==0)
            break;
        }
    }
    return 0;
} //筛选法求素数 

3:分解一个数的质因子,其中a[]存的是素数,f[]存的是某个数的质因子= =

int get_fx(int x)
{
     int j,k=0;
     for( j=0;a[j]*a[j]<=x;j++)
     {
         if(x%a[j]==0)
        f[ k++]=a[j];
         while(x%a[j]==0)
         {
          x=x/a[j];
          f[k++]=a[j];
        }
        if(x==1)
        break;
     }
     if(x!=1)
     f[k++]=x;
     return 0
}

4:能被11整除的数他满足奇位数上和-偶位数和的绝对值能被11整除= =

to be continued~~~

时间: 2024-12-15 22:02:56

ACM数论中的常见的模板和结论的相关文章

ACM数论中相关定理(不断更新)

费马小定理是数论中的一个重要定理,其内容为: 假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p).即:假如a是整数,p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1. 费马大定理,又被称为“费马最后的定理”,由法国数学家费马提出.它断言当整数n >2时,关于x, y, z的方程 x^n + y^n = z^n 没有正整数解.被提出后,经历多人猜想辩证,历经三百多年的历史,最终在1995年被英国数学家安德鲁·怀尔斯证明. 中国剩余定理的结论: 令任意固定整数

C++中的可变参数模板

作者:Eli Bendersky http://eli.thegreenplace.net/2014/variadic-templates-in-c/ 回到C++11前夜,编写带有任意参数函数的唯一办法是使用可变参数函数,像printf,使用省略号语法(-)以及伴随的va_族的宏.如果你曾经使用这个方法编写代码,你会知道这有多累赘.除了变成类型不安全外(所有的类型解析必须在运行时在va_arg里通过显式转换来完成),要做对并不容易.Va_宏执行低级的内存操作,我看见过许多因为没有小心使用它们导致

ACM数论-欧几里得与拓展欧几里得

ACM数论--欧几里得与拓展欧几里得 欧几里得算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). int gcd(int a,int b) { return b ? gcd(b,a%b) : a; } 扩展欧几里德算法: 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使

php学习笔记(JS中的常见方法)

JS中的常见方法: 1.日期时间函数(需要用变量调用): var b = new Date(); //获取当前时间 b.getTime() //获取时间戳 b.getFullYear() //获取年份 b.getMonth()+1; //获取月份 b.getDate() //获取天 b.getHours() //获取小时 b.getMinutes() //获取分钟 b.getSeconds() //获取秒数 b.getDay() //获取星期几 b.getMilliseconds() //获取毫

ACM数论之旅4---扩展欧几里德算法(欧几里德(???)?是谁?)

为什么老是碰上 扩展欧几里德算法 ( •?∀•? )最讨厌数论了 看来是时候学一学了 度娘百科说: 首先, ax+by = gcd(a, b) 这个公式肯定有解 (( •?∀•? )她说根据数论中的相关定理可以证明,反正我信了) 所以 ax+by = gcd(a, b) * k 也肯定有解 (废话,把x和y乘k倍就好了) 那么已知 a,b 求 一组解 x,y 满足 ax+by = gcd(a, b) 这个公式 1 #include<cstdio> 2 typedef long long LL;

iOS之多控制器管理--项目中的常见文件

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

IOS中NSSData常见用法

一.NSdata的概念 1.使用文件时需要频繁地将数据读入一个临时存储区,它通常称为缓冲区 2.NSdata类提供了一种简单的方式,它用来设置缓冲区,将文件的内容读入缓冲区,或者将缓冲区内容写到一个文件. 3.对于32位应用程序,NSdata缓存最多2GB 4.我们有两种定义 NSData(不可变缓冲区),NSMutableData(可变缓冲区) NSData *fileData; NSFileManager *fileManager = [[NSFileManager alloc]init];

IOS中NSNumber常见用法

一.NSnumber常见用法 NSNumber + (NSNumber *)numberWithInt:(int)value; + (NSNumber *)numberWithDouble:(double)value; - (int)intValue; - (double)doubleValue; -(float)floatValue; 二.使用 NSNumber * intNumber=[NSNumber numberWithInt:100]: NSNumber *floatNumber=[N

【ZOJ】3785 What day is that day? ——浅谈KMP应用之ACM竞赛中的暴力打表找规律

首先声明一下,这里的规律指的是循环,即找到最小循环周期.这么一说大家心里肯定有数了吧,“不就是next数组性质的应用嘛”. 先来看一道题 ZOJ 3785 What day is that day? Time Limit: 2 Seconds      Memory Limit: 65536 KB It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days? Input There are multiple tes