日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中国剩余定理模板

發布時間:2024/9/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中国剩余定理模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*中國剩余定理簡單解釋:定理:如果a%b=c 那么(a+kb)%b=c首先看一個簡單例子:對于x%3=2,x%5=3,x%7=2,求解x(最小)令m[i]=3,5,7 a[i]=2,3,2;我們假設n1%3=2,但是又要滿足另外兩個方程的解,那么n1必須是5,7的倍數同理n2%3=2且n2必須是3,7的倍數,n3%7=2且n3必須是3,5的倍數那么(n1+n2+n3)就是滿足這三個同余方程的一個解因此x=(n1+n2+n3)%M那么如何求n1,n2,n3呢?可通過歐幾里得算法求解令M=LCD(m[i])即這三個數的最小公倍數,又因為它們互質所以M=m[i]*m[2]*m[3];Ni=M/m[i],那么ni=Ni*t使得Ni*t%m[i]=a[i]得到方程Ni*t+m[i]*y=a[i],t,y為要求的變量ni=Ni*t*a[i],因為通過歐幾里得算出來的t只滿足Ni*t%m[i]=1,因此還需要乘以a[i]*/#include <iostream> #include<cstdio> #include<cstring> using namespace std; //歐幾里得算法 __int64 extend_euclid(__int64 a,__int64 b,__int64 &x,__int64 &y) {if(b==0){x=1;y=0;return a;}__int64 d = extend_euclid(b,a%b,x,y);__int64 t = x;x=y;y=t-a/b*y;return d; } //中國剩余定理求解x=a[i](mod(m[i]))---也就是x%m[i]=a[i],只針對m[i]互質情況 //參數len,同余方程的個數,m[i],a[i]從1開始,int類型根據題意更改 __int64 cnt(int len,__int64 m[],__int64 a[]) {__int64 M = 1,ans = 0;for(int i=1;i<=len;i++)M*=m[i];__int64 x,y;for(int i=1;i<=len;i++){__int64 Ni = M/m[i];extend_euclid(Ni,m[i],x,y);x=(x%m[i]+m[i])%m[i];//保證x為最小的正數解ans=(ans+x*a[i]*Ni)%M;}if(ans<0)ans=ans+M;return ans; } int main() {int n;__int64 m[10],a[10];scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%I64d%I64d",&m[i],&a[i]);printf("%I64d\n",cnt(n,m,a));return 0; }

?

轉載于:https://www.cnblogs.com/wt20/p/5775218.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的中国剩余定理模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。