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