2017年11月12题训练日记

       发现博客10点以后提交不上,数论一会就结束 了,下面说一下部分知识点:

快速幂:

 

int pow_mod(int n,int k,int m) //快速幂求n^k余m的结果

{  
    int res=1;  
    n=n%mod;
    while(k>0)  
    {  
        if(k&1)  
            res=res*n%m;  
        n=n*n%m;  
        k>>=1;  
    }  
    return res;  
}  

经常会遇到求一个大数的前几位和后几位,快速幂是可以求后几位的,用log10函数求大数首部数,比如

 

n^k = X *10 ^(len-1)             //len是整数的长度,X是10整数位置只有一位的n^k值的浮点数表示
两边取对数:
K*log10(N)=(len-1)+log10( X )
double tmp=k*log10(n*1.0);  //temp等于左边
tmp=tmp-(long long)tmp;     //因为log(x)小于1,而(len-1)为整数,所以temp减去整数部分就只剩下log10(x)
tmp=pow(10.0,tmp);            //10^[log10(x)]==x
ans1=(ll)(tmp*100);            //x*100整数部分为3位

题目:UVA-11029-Leading and Trailing      UVa - 10692 - Huge Mods

 

 

唯一分解定理:

任意一个整数中可以写成x=(p1^a1)*(p2^a2).......(pi^ai) ,ai为一系列素数

这是解数论题时经常利用的一个性质,有题目:UVA 10791 Minimum Sum LCM  UVA 10539 Almost Prime Numbers

http://blog.csdn.net/sdau20163942/article/details/78450887

 

 

中国剩余定理:

牵扯到同余等等概念,所以其求解会用到下面的扩展欧几里得,是求解一次同余式组的方法,其定义如下

设正整数两两互素,则同余方程组

 

                             

 

有整数解。并且在模下的解是唯一的,解为

 

                               

 

其中,而的逆元。

典型应用的题目有:poj-1006-Biorhythms

 

 

欧几里得与扩展欧几里得

扩展欧几里得是用来求ax+by=c的解,且如果c%gcd(a,b)!=0,则误解,用解出的(x0,y0)可以得到解系(x0+k*b',y0+ka'),a'=a/gcd(a,b),b'=b/gcd(a,b);

 

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

void extend_Euclide(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return;
    }
    extend_Euclide(b,a%b,x,y);
    int temp=x;
    x=y;
    y=temp-(a/b)*y;
}

 

 

void extend_Euclide(ll a,ll b,ll &d,ll &x,ll &y)
{
    if(b==0)
    {
        d=a;
        x=1;
        y=0;
        return;
    }
    extend_Euclide(b,a%b,d,y,x);
    y-=x*(a/b);
}

 

 

 

 

 

 

 

经常用到的比较优化的筛素数

 

void init()  
{  
    int m=sqrt(1000000+0.5);  
    int i,j;  
    c=0;  
    for(i=2;i<=m;i++)  
    {  
        if(!vis[i])  
        {  
            for(j=i*i;j<=1000000;j+=i)  
            {  
                vis[j]=true;  
            }  
        }  
    }
    for(i=2;i<=1000000;i++)  
    {  
        if(!vis[i])  
            prime[c++]=(ll)i;  
    }  
}

 

 

 

欧拉函数
求对于正整数n求小于n且与n互质的数的个数

 

ll euler_phi(ll n) //较快
{
    ll ans=n;
    for(ll i=2;i*i<=n;i++)
    if(n%i==0)
    {
        ans-=ans/i;
        while(n%i==0)
            n/=i;
    }
    if(n>1)
        ans-=ans/n;;
    return  ans;
}

 

 

 

 

 

 

int euler_phi(int n)  
{  
    int m=(int)sqrt(n+0.5);  
    int ans=n;  
    for(int i=2;i<=m;i++)  
    {  
        if(n%i==0)  
        {  
            ans=ans/i*(i-1);  
            while(n%i==0)  
                n/=i;  
        }  
    }  
    if(n>1)  
        ans=ans/n*(n-1);  
    return ans;  
}  

还可以直接求出所有的欧拉函数值

 

 

int phi[M];  
void init() //预先求出所有的欧拉函数  
{  
    int i,j;  
    for(i=2;i<M;i++)  
        phi[i]=0;  
    phi[1]=1;  
    for(i=2;i<M;i++)  
        if(!phi[i])  
    {  
        for(j=i;j<M;j+=i)  
        {  
            if(!phi[j])  
                phi[j]=j;  
            phi[j]=phi[j]/i*(i-1);  
        }  
    }  
}  

 

题目:UVa - 10692 - Huge Mods UVA - 10820 - Send a Table  uva-10299-Relatives

 

数论中,欧拉定理,(也称费马-欧拉定理)是一个关于同余的性质。欧拉定理表明,若n,a为正整数,且n,a互质,则:

                                  a^(φ(n))=1 (mod n)


其余内容以后再补充
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值