• P2613 有理数取余


    原题链接 https://www.luogu.org/problemnew/show/P2613

    在这里虽然是讲洛谷的题解,但用到的数论知识,归并到数论里也不为过!

    进入正题:

    首先看到题面:给出一个有理数c=a/b,求c mod 19260817的值。

    看一下数据范围

    我滴天!!!又要写高精???GG无疑!!!

     咦,既然要取余,还做乘法运算,那只要写个快读在读入时取膜不就好啦,这样就爆不了long long 了。

    有理数求余???搞笑呢,不是只有整数求余嘛?

    我们知道有理数包含整数和分数,那么分数求余我们都知道是没有什么意义的。

    那肿么办呢?——转化!!!

    前面说过这是一道数论题,那么解此题一定要用到数论知识!!!

    在我发现的数论知识里,可以用以下两个知识来解此题:

    1.费马小定理

    如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。

    此题已经明确给出mod数19260817,显然它是一个质数,那么我们就可以用费马小定理转化一下,如下:

    因为a^(p-1)≡1(mod p)

    所以a^(p-2)≡a^(-1) (mod p)    (A)

    所以c=a/b=a*b^(-1)≡a*b^(p-2) (mod p)

    证毕!

    所以我们就可以将在膜p意义下的a/b转化成a*b^(p-2)的形式,所以我们只要求出b^(p-2)就大功告成啦,具体做法用快速幂。

    2.扩展欧几里德

    上面已经证过求在膜p意义下的a/b就是求a*b^(-1),b^(-1)就是b的逆元

    下面给出求b的逆元的一种方法:

    若存在一个数x,满足bx≡1 (mod p),那么x就是b的逆元

    可将bx≡1 (mod p)进一步转化:

    bx-1≡0 (mod p)

    bx-1=-yp    (注:这里说一下为什么是-y,其实这里是不是正负无所谓,写成负的更便于理解)

    bx+py=1

    化简到这里我们就知道要用扩展欧几里德做了,求出了b的逆元x后再乘a取膜就是最后答案啦,下面看代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const long long mod=19260817;
    inline long long read()       //快读,边读边取余 
    {
        long long t=0;
        char ch=getchar(); 
        while(ch<'0'||ch>'9') ch=getchar();
        while(ch>='0'&&ch<='9')
        {
            t=(t*10+(ch-'0'))%mod;
            ch=getchar();
        }
        return t;
    }
    int exgcd(long long a,long long b,long long &x,long long &y)    //扩展欧几里德算法,求b的逆元 
    {
        if(b==0)
        {
            x=1;y=0;
            return a;
        }
        long long r=exgcd(b,a%b,x,y);
        long long q=x;
        x=y;
        y=q-a/b*y;
        return r;
    }
    int main()
    {
        long long a,b,x,y;
        a=read();
        b=read();
        if(b==0)                 //一步特判,因为b是分母不能是0,如果b==0则无解 
        {
            cout<<"Angry!";
            return 0;
        }
        exgcd(b,mod,x,y);
        x=(x%mod+mod)%mod;      //这步操作是确保x是b的逆元中最小的正整数 
        printf("%lld",(a%mod*x%mod)%mod);     //记得多膜几次哦 
        return 0;
    }

    其实作为一个提高+/省选-是不是有点夸大了?

  • 相关阅读:
    大型网站随着业务的增长架构演进
    springboot日志logback配置
    一些容易出错的细节
    从一个下载优化说起
    徒手优化冒泡排序
    php设计模式之观察者模式
    php设计模式之抽象工厂模式
    phper談談最近重構代碼的感受(3)
    php设计模式----工厂模式
    偏执的我从Linux到Windows的感受
  • 原文地址:https://www.cnblogs.com/xcg123/p/10698735.html
Copyright © 2020-2023  润新知