基礎(chǔ)數(shù)論

大數(shù)取模

       ll ans=0;
       for(int i=0; i<strlen(s); i++)
       {
           ans=(ans*10+s[i]-'0')%mod;
       }

快速冪

  • 計算一個數(shù)an次冪即a^n
    快速冪的思想就是將指數(shù)n轉(zhuǎn)化成二進制再進行求解
  • eg:a^{11}
    其中指數(shù)(11)_2=1011,所以我們可以求出a^{11}=a^{2^0+2^1+2^3}=a^{1}*a^{2}*a^{8}按照循環(huán)要循環(huán)11次,現(xiàn)在只要計算3次,所以快速冪的時間復雜度是log(n)
long long power(int a,int n)
{
   long long ans=1;
   long long base=a;
   while(n)
   {
       if(n&1)
       {
           ans=ans*base;
       }
       base=base*base;
       n>>=1;
   }
   return ans;
}

歐幾里得

  • 求最大公約數(shù)
long long gcd(long long a,long long b)
{
   if(b==0)
   {
       return a;
   }
   else
   {
       return gcd(b,a%b);
   }
}
  • 最小公倍數(shù)=a*b/gcd(a,b)

擴展歐幾里得

  • 對于不完全為 0 的非負整數(shù) a,b,gcd(a,b)表示 a,b 的最大公約數(shù)括饶,必然存在整數(shù)對 ( x , y ) , 使得 ax + by = gcd ( a , b ).

證明

  • ①:b == 0 立即推 => x = 1 , y = 0 ;
    ②:a\&\&b
    設(shè)a * x1 + b * y1 = gcd ( a , b ) ;
    設(shè)b * x2 + ( a \% b ) * y2 = gcd ( b , a \% b ) ;
    已知:gcd ( a , b ) == gcd ( b , a \% b ) (歐幾里得)
    立即推
    => a * x1 + b * y1 = b * x2 + ( a\% b ) * y2 ;
    => a * x1 + b * y1 = b * x2 + ( a – a / b * b ) * y2 ;
    = a * y2 + b * ( x2 – ( a / b ) * y2 ) ;
    可得: x1 = y2 ;
    y1 = x2 – ( a / b ) * y2 ;
define ll long long
void exgcd(ll a,ll b,ll &gcd,ll &x,ll &y)
{
     if(b==0)
     {
           x=1;
           y=0;
           gcd=a;
     }
     else
     {
           exgcd(b,a%b,gcd,y,x);
           y-=x*(a/b);
     }
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
     if(b==0)
     {
           x=1;
           y=0;
           return a;
     }      
     ll r = exgcd(b,a%b,y,x);
     y-=x*(a/b);
     return r;
}

逆元

  • 對于正整數(shù)a坛增,如果有a*x≡1(mod\ \ \ m)
    (即a*x\%m==1),那么把這個同余方程中的最小正整數(shù)解x叫做am的逆元。

  • 逆元用途
    如何求解(A/B)\%C植康,取模運算中(A/B)\%C!=(A\%C)/(B\%C)
    在這種情況下就要求B在模C的情況下的逆元B^{'}
    (B*B^{'}\%C==1),
    然后(A/B)\%C==(A*B^{'})\%C

  • 逆元求法
    ①.費馬小定理
    假如m是一個質(zhì)數(shù)gcd(a,m)==1那么m^{'}=a^{m-2}
    因為根據(jù)費馬小定理可知a^{m-1}≡1\ (mod\ \ m)
    a*a^{m-2}≡1\ \ (mod\ \ m)
    所以m^{'}=a^{m-2}
    ②.擴展歐幾里得算法
    擴展歐幾里得(a , m互質(zhì) 瞧壮,且m不是質(zhì)數(shù)時也可使用)
    求解a*x+b*m=1
    解出的最小正整數(shù)解x叫做am的逆元蝌麸。

ll inv ( ll a , ll b )
{
   ll gcd, x, y;
   exgcd(a, b, gcd, x, y);
   return gcd == 1 ? ( x % b + b ) % b : -1 ;   // x 可能為負數(shù)
}

中國剩余定理
\begin{cases} x≡a_1\ \ mod\ \ m_1\\ x≡a_2\ \ mod\ \ m_2\\ ...\\ x≡a_n\ \ mod\ \ m_n\\ \end{cases}
其中m_1,m_2,m_3,m_4,...,m_n兩兩互質(zhì)的整數(shù)

結(jié)論:


其中
M=m_1*m_2*....*m_n
t_i=inv(M/m_i,m_i)
M_i=M/m_i

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int mm=1e6+10;
ll c[mm],mod[mm];
ll exgcd(ll a,ll b,ll &gcd,ll &x,ll &y)
{
   if(b==0)
   {
       x=1;
       y=0;
       gcd=a;
   }
   else
   {
       exgcd(b,a%b,gcd,y,x);
       y-=x*(a/b);
   }
}
ll inv(ll a,ll b)
{
   ll gcd,x,y;
   exgcd(a,b,gcd,x,y);
   return gcd==1?(x%b+b)%b:-1;
}
int main( )
{
   int n;
   while(~scanf("%d",&n))
   {

       ll ans=1;
       for(int i=1; i<=n; i++)
       {
           scanf("%lld%lld",&mod[i],&c[i]);
           ans*=mod[i];
       }
       ll sum=0;
       for(int i=1; i<=n; i++)
       {
           ll a=ans/mod[i]; ll b=mod[i];
           sum=(sum+c[i]*a*inv(a,b)%ans)%ans;
       }
       printf("%lld\n",sum);
   }
   return 0;
}

擴展中國剩余定理
\begin{cases} x≡a_1\ \ mod\ \ m_1\\ x≡a_2\ \ mod\ \ m_2\\ ...\\ x≡a_n\ \ mod\ \ m_n\\ \end{cases}
其中m_1,m_2,m_3,m_4,...,m_n兩兩不一定互質(zhì)的整數(shù)

\begin{cases} x≡a_1\ \ mod\ \ m_1\\ x≡a_2\ \ mod\ \ m_2\\ \end{cases}
\begin{cases} x=a_1+k_1*m_1\\ x=a_2+k_2*m_2\\ \end{cases}
k_1*m_1+(-k_2)*m_2=a_2-a_1
d=gcd(m_1,m_2),c=a_2-a_1
根據(jù)擴展歐幾里得算法求解x,y,滿足x*m_1+y*m_2=d
x*(c/d)*m_1+y*(c/d)*m_2=d*c/d
\begin{cases} k_1=x*(c/d)\\ k_2=-y*(c/d)\\ \end{cases}
實際上有多組解
\begin{cases} k_1=x*(c/d)+(m_2/d)*n\\ k_2=-y*(c/d)-(m_1/d)*n\\ \end{cases}\ \ \ \ \ n\in Z

k_1的最小整數(shù)解莉恼,
\begin{cases} ans=a_1+k_1m_1\\ M=lcm(m_1,m_2) =(m_1*m_2)/d\ \ \ \ \ \\ \end{cases}
最后合成x≡ans(mod\ \ M)

void exgcd(ll a,ll b,ll &gcd,ll &x,ll &y)
{
   if(b==0)
   {
       x=1;
       y=0;
       gcd=a;
   }
   else
   {
       exgcd(b,a%b,gcd,y,x);
       y-=x*(a/b);
   }
}
ll mul(ll a,ll n,ll m)//快速乘
{
   ll ans=0;
   ll base=a;
   while(n)
   {
       if(n&1)
       {
           ans=(ans+base)%m;
       }
       base=(base+base)%m;
       n>>=1;
   }
   return ans%m;
}
ll excrt(int n)
{
   ll x,y,gcd;
   ll M=1,ans=0;//k數(shù)組是被模數(shù),mod數(shù)組是模數(shù)赊级,k%mod
   for(int i=1;i<=n;i++)
   {
       ll a=M;
       ll b=mod[i];
       ll c=(k[i]-ans%b+b)%b;
       exgcd(a,b,gcd,x,y);
       if(c%gcd!=0)
       {
           return -1;
       }
       ll t=b/gcd;
       x=mul(x,c/gcd,t);
       ans+=x*M;//更新前i個方程組的答案
       M*=t;//前i個modi的小公倍數(shù)
       ans=(ans%M+M)%M;
   }
   return (ans%M+M)%M;
}

P4777 【模板】擴展中國剩余定理(EXCRT)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int MAX=1e5+10;
ll k[MAX],mod[MAX];//mod數(shù)組是模數(shù),k數(shù)組是被模數(shù)-->>k%mod
void exgcd(ll a,ll b,ll &gcd,ll &x,ll &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        gcd=a;
    }
    else
    {
        exgcd(b,a%b,gcd,y,x);
        y-=x*(a/b);
    }
}
ll mul(ll a,ll n,ll m)
{
    ll ans=0;
    ll base=a;
    while(n)
    {
        if(n&1)
        {
            ans=(ans+base)%m;
        }
        base=(base+base)%m;
        n>>=1;
    }
    return ans%m;
}
ll excrt(int n)
{
    ll x,y,gcd;
    ll M=1,ans=0;
    for(int i=1; i<=n; i++)
    {
        ll a=M;
        ll b=mod[i];
        ll c=(k[i]-ans%b+b)%b;
        exgcd(a,b,gcd,x,y);
        if(c%gcd!=0)
        {
            return -1;
        }
        ll t=b/gcd;
        x=mul(x,c/gcd,t);
        ans+=x*M;
        M*=t;
        ans=(ans%M+M)%M;
    }
    return (ans%M+M)%M;
}
int main( )
{
    int n;
    while(~scanf("%d",&n))
    {

        for(int i=1; i<=n; i++)
        {
            scanf("%lld%lld",&mod[i],&k[i]);
        }
        printf("%lld\n",excrt(n));
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末押框,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子理逊,更是在濱河造成了極大的恐慌橡伞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晋被,死亡現(xiàn)場離奇詭異兑徘,居然都是意外死亡,警方通過查閱死者的電腦和手機羡洛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門挂脑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欲侮,你說我怎么就攤上這事最域。” “怎么了锈麸?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牺蹄。 經(jīng)常有香客問我忘伞,道長,這世上最難降的妖魔是什么沙兰? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任氓奈,我火速辦了婚禮,結(jié)果婚禮上鼎天,老公的妹妹穿的比我還像新娘舀奶。我一直安慰自己,他們只是感情好斋射,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布育勺。 她就那樣靜靜地躺著但荤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涧至。 梳的紋絲不亂的頭發(fā)上腹躁,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音南蓬,去河邊找鬼纺非。 笑死,一個胖子當著我的面吹牛赘方,可吹牛的內(nèi)容都是我干的烧颖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窄陡,長吁一口氣:“原來是場噩夢啊……” “哼炕淮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泳梆,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鳖悠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后优妙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乘综,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年套硼,在試婚紗的時候發(fā)現(xiàn)自己被綠了卡辰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡邪意,死狀恐怖九妈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雾鬼,我是刑警寧澤萌朱,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站策菜,受9級特大地震影響晶疼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜又憨,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一翠霍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蠢莺,春花似錦寒匙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽考蕾。三九已至,卻和暖如春棵癣,著一層夾襖步出監(jiān)牢的瞬間辕翰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工狈谊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喜命,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓河劝,卻偏偏與公主長得像壁榕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赎瞎,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,342評論 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,030評論 0 2
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,331評論 0 10
  • (開經(jīng)偈) 無上甚深微妙法 百千萬劫難遭遇 我今見聞得受持 愿解如來真實義 第一品 Fǎ huì yīn yóu ...
    黃一軒閱讀 4,070評論 0 1
  • 6月23日(星期日)公司組織員工去浙江余姚牟山摘楊梅牌里,大家預定七點半出發(fā)的。七點不到务甥,我收到了公司員工黃子全的...
    可燃上海閱讀 963評論 4 16