数论之 素因子分解,素数筛选法,欧拉函数和扩展欧几里得算法 (整理)

今天突然想复习一下数论,也就顺便整理了一下关于数论的基础知识,
以后用的时候直接用就行了,也不用现敲了,其实就是有点懒。。。。

具体解释都在代码里有解释

直接上代码了:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;

#define MM(a) memset(a,0,sizeof(a))

typedef long long LL;
typedef unsigned long long ULL;
const int maxn = 1e4+5;
const int mod = 1000000007;
const double eps = 1e-7;
bool prime[maxn];
int p[maxn],k;
///素数筛选
void isprime()
{
    k = 0;
    MM(prime);
    for(int i=2; i<maxn; i++)
    {
        if(!prime[i])
        {
            p[k++] = i;
            for(int j=i*i; j<maxn; j+=i)
                prime[j] = 1;
        }
    }
}
int fac[maxn], num[maxn], cnt;
///分解素因子算法
void Dec(int x)
{
    MM(num);
    cnt = 0;
    for(int i=0; p[i]*p[i]<=x&&i<k; i++)
    {
        if(x%p[i] == 0)
        {
            fac[cnt] = p[i];
            while(x%p[i] == 0)
            {
                num[cnt]++;
                x /= p[i];
            }
            cnt++;
        }
    }
    if(x > 1)
    {
        fac[cnt] = x;
        num[cnt++] = 1;
    }
}
///欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2
int Euler(int m)
{
    int ret = m;
    for(int i=2; i*i<=m; i++)
    {
        if(m%i == 0)
            ret -= ret/i;
        while(m%i == 0)
            m /= i;
    }
    if(m > 1)
        ret -= ret/m;
    return ret;
}
///最大公约数
LL gcd(LL x, LL y)
{
    if(y == 0)
        return x;
    return gcd(y, x%y);
}
///扩展欧几里得算法
void exgcd(LL a, LL b, LL &x, LL &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return;
    }
    exgcd(b, a%b, x, y);
    LL tmp = x;
    x = y;
    y = tmp-(a/b)*y;
}

int main()
{
    int m, t;
    //isprime();
    cin>>t;
    while(t--)
    {
///素因子分解
        /**
        cin>>m
        Dec(m);
        for(int i=0; i<cnt-1; i++)
            for(int j=0; j<num[i]; j++)
                cout<<fac[i]<<'*';
        for(int i=0; i<num[cnt-1]-1; i++)
            cout<<fac[cnt-1]<<"*";
        cout<<fac[cnt-1]<<endl;
        **/
///欧拉函数
        /**cout<<Euler(m)<<endl;**/

///扩展欧几里得算法
        /**
        LL a, b, x, y;
        cin>>a>>b;
        if(gcd(a,b) != 1)///没有解
        {
            puts("Sorry");
            continue;
        }
        exgcd(a, b, x, y);
        x = (b + x % b) % b;
        y = (1 - a * x) / b;
        cout<< x << " " << y << endl;
        **/
    }
    return 0;
}
时间: 2024-12-19 20:17:58

数论之 素因子分解,素数筛选法,欧拉函数和扩展欧几里得算法 (整理)的相关文章

HDU 1286 找新朋友(欧拉函数模板)

HDU 1286 找新朋友:http://acm.hdu.edu.cn/showproblem.php?pid=1286 题意:中文题. 思路:欧拉函数的纯模板题,没什么好说的,主要是理解欧拉函数的意义. 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等. 例如φ(8)=4,因为1,3,5,7均和8互质.   ----by度娘. 更多精彩内容:http://www.bia

如何用线性筛法求欧拉函数

前几天做了一个关于欧拉函数的题,当时就做超时了,因为我是暴力做的,后来百度了一下 线性晒法求欧拉函数,所以今天就打算系统的看一下筛法求欧拉函数的问题,该算法在可在线性时间内筛素数的同时求出所有数的欧拉函数: 先介绍一下暴力的欧拉函数: Eular(m) = m - (1-1/p1) - (1-1/p2) - ... - (1-1/pk)  [其中 p1, p2...pk为m的素因子] int Eular(int m) { int ret = m; for(int i=2; i<m; i++) {

hdu 1695 GCD【欧拉函数+容斥原理】

GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6253    Accepted Submission(s): 2291 Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y

欧拉函数性质

先来介绍几个与欧拉函数有关的定理: 定理一:设m与n是互素的正整数,那么 定理二:当n为奇数时,有. 因为2n是偶数,偶数与偶数一定不互素,所以只考虑2n与小于它的奇数互素的情况,则恰好就等于n的欧拉函数值. 定理三:设p是素数,a是一个正整数,那么 关于这个定理的证明用到容斥: 由于表示小于与互素数的正整数个数,所以用减去与它不互素的数的个数就行了. 那么小于与不互素数的个数就是p的倍数个数,有个.所以定理得证. 定理四:设为正整数n的素数幂分解,那么 这个定理可以根据定理一和定理三证明,其实

A - Farey Sequence——(筛法求欧拉函数)

传送门 A - Farey Sequence Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b &l

HDU 3501 Calculation 2:欧拉函数的应用

HDU 3501 Calculation 2:http://acm.hdu.edu.cn/showproblem.php?pid=3501 大意:求1~n之间与n不互质的数的总和. 思路:欧拉函数的应用:先用欧拉函数求出与n互质的总数m,计算m个数的总和,用n的总和减去m的总和就是想要的结果. 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ #include <stdio.h> #define LL _

UVa 11417 GCD (欧拉φ函数)

11417 - GCD Time limit: 2.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2412 Given the value of N, you will have to find the value of G. The definition of G is given

欧拉函数

欧拉函数: 是少于或等于n的数中与n互质的数的数目 欧拉函数的值 通式:Euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)-..(1-1/pn),其中p1, p2--pn为x的所有质因数,x是不为0的整数.Euler(1)=1(唯一和1互质的数(小于等于1)就是1本身). (注意:每种质因数只一个.比如12=2*2*3那么Euler(12)=12*(1-1/2)*(1-1/3)=4: Eg : Euler(12) = 4,与12互质的数有1 5 7 11,所以E

欧拉函数模板

欧拉函数:表示1-(n-1)中,与n互质的数的个数 本以为学会容斥原理就不必再看欧拉函数,可是偏偏就是有些题用容斥原理解不了,必须参考欧拉,没办法只好回头看欧拉函数 下面贴一个筛法求欧拉函数模板: //初始化eu[1]=0或者eu[1]=1,具体情况根据题目变化! //下面计算2-10000的欧拉函数 const int MAX = 10001; int eu[MAX];//不要忘记初始化eu[1]. void eular(){ for(int i=2;i<MAx;i++){ if(!eu[i]