快速幂、数论初步

今天是从头开始学一遍。先看的快速幂。晚上学长讲课又简单开始讲了一点数论的知识,这部分的内容正好结合了起来。晚上回到宿舍总结一下今天学到的算法知识

1、(a^b)%p

//用来求(a^b)%p
int power(int a,int b,int p)
{
    int ans= 1 % p;
    for(;b;b>>=1)//b>>=1 等价于 b=b>>1;
    {
        if(b&1)//二进制b与1 的且运算
            ans=(long long)ans*a%p;
        a=(long long)a*a%p;
    }
    return ans;
}

2、(ab)%p

long long mul(long long a,long long b,long long p)
{
    long long ans=0;
    for(;b;b>>=1)
    {
        if(b&1)ans =(ans+a)%p;
        a=a*2 %p;
    }
    return ans;
}

3、POJ1995
还是一道比较常规的题目,要记得取模的性质
(a+b)%p 等价于 (a%p+b%p)%p
(ab)%p 等价于 (a%pb%p)%p
证明:设a=k1
p + t1, b=k2*p + t2
则a%p=t1, b%p=t2;
(a+b)%p=((k1+k2)*p+(t1+t2))%p = (t1+t2) =(a%p+b%p)%p

除法需要用到逆元的概念,我还不太熟悉,等到学会了再写证明……

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll mod_pow(ll a,ll b,ll p)
{
    ll ans=1ll;
    a%=p;
    while(b)
     {
        if(b&1)
        ans=(ans*a)%p;
        a=(a*a)%p;
        b>>=1;
    }
    return ans;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        ll M,a,b,ans=0ll;
        cin>>M;
        int H;
        cin>>H;
        while(H--)
        {
            cin>>a>>b;
            ans=(ans+mod_pow(a,b,M))%M;
        }
        cout<<ans<<endl;
    }
    return 0;
}

4、数论初步
下面放一个简单的提纲吧,我就不写具体内容了,还没有完全搞明白……

一、 数论简介

a)      
模域

二、 数论函数及筛子(埃米筛,线性筛)

a)      
素数

b)     
欧拉函数

c)      
莫比乌斯函数

d)     
因数分解       
	i.          
	因子分解                  
	ii.          
	质因子分解
e)      
素性判定                        
	i.          
	严格判定                     
	ii.          
	米诺罗宾判定

二、 基本技巧

a)      
gcd(a,b) = gcd(b,a%b);
b)     
exgcd(a,x,b,y,c) =exgcd(b,y+a/b*x,a%b,x,c);
c)      
中国剩余定理

三、 数论逆元
a)
Exgcd
b)
费马小
c)
线性dp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值