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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 2115 C Looooops(扩展欧几里德算法)

發(fā)布時(shí)間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 2115 C Looooops(扩展欧几里德算法) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?題意:

? ? ? ?對(duì)于for(i=A ; i!=B ;i+=C)循環(huán)語句,問在k位存儲(chǔ)系統(tǒng)中循環(huán)幾次才會(huì)結(jié)束。
  比如:當(dāng)k=4時(shí),存儲(chǔ)的數(shù) i 在0-15之間循環(huán)。(本題默認(rèn)為無符號(hào))

  若在有限次內(nèi)結(jié)束,則輸出循環(huán)次數(shù)。

  否則輸出死循環(huán)。

二,思路:
本題利用擴(kuò)展歐幾里德算法求線性同余方程,設(shè)循環(huán)次數(shù)為 x ,則解方程 (A + C*x) % 2^k = B;求出最小正整數(shù) x。?
  1,化簡方程化為求線性同余方程標(biāo)準(zhǔn)式 ax ≡ b (mod n);
  2,擴(kuò)展歐幾里德算法求解線性同余方程 C*x ≡ B-A (mod 2^k);上面的紅色公式轉(zhuǎn)化為這個(gè)式子沒有看懂(兩者之間的轉(zhuǎn)化)
  3,求出最小非負(fù)整數(shù)解。

1、化簡:(A + C*x) mod 2^K = B ?--> ?C*x mod 2^k = B-A ?--> ? C*x ≡ B-A (mod 2^k);??

(A+x*C)%(2^k)=B?變形(2^k)*y+B=A+C*x ==> ?C*x+(-(2^k)*y)=B-A;這個(gè)變形比較實(shí)用吧

2、求線性同余方程 C*x ≡ B-A (mod 2^k) ,

就相當(dāng)于求二元一次方程 C*x + 2^k * y = B-A?

  i,代入擴(kuò)展歐幾里德算法,求解方程 C*x + 2^k * y = gcd(C , 2^k) ;?

  ii,利用方程 C*x + 2^k * y = gcd(C , 2^k)的解 x0 和x1 = x0 * c/d 求出原方程 a*x + b*y = c 的解 x1 ;前提是:d|c (c 能被 d 整除);

3、利用周期性變化求最小的非負(fù)整數(shù)解 公式: x1 = (x1 % (b/d) + (b/d) ) % (b/d);
? ? ? 若方程的C*x + 2^k * y = B-A 的一組整數(shù)解為(x1 , y1),則它的任意整數(shù)解為(x1 + k * (b/d) , y1 - k * (a/d) ) ( k取任意整數(shù) ), T = b/d就為 x1 增長的周期?
     i,若x1為負(fù)值,取最大的非正值:x1 = x1 % T ; 若x1為正值,以下兩步無影響;?
     ii,取正 :x1 = x1 + T ;

     iii, 防止 i 中的 x1=0 即 ii 中的 x1=T :x1 = x1 % T ;

看到數(shù)論概論中的得到的一些總結(jié)(和上面的(2)ii類似:

已知ax+by=1的一組解為(x1,y1),那么其他組的解為(x1+k*b,y1-k*a)(k為任意整數(shù))?

當(dāng)ax+by=gcd(a,b)=d時(shí),其他組的解變?yōu)?#xff08;x1+k*b/d,y1-k*a/d),因此b/d就成為了一個(gè)增長周期

#include <iostream> using namespace std; void exgcd(long long a,long long b,long long &d,long long &x,long long &y) {if(!b)//b==0說明上層a%b==0上層的b(這層的a)為最大公因數(shù),則a*x+b*y=a{d=a; //遞歸到這時(shí)候a就是最大公因數(shù)( d用來存儲(chǔ)gcd(a,b)的值)//結(jié)合上一層exgcd(b,a%b,d,y,x)x=1;y=0;}else{exgcd(b,a%b,d,y,x);y=y-x*(a/b);//...........} } int main() {long long A,B,C,x,y,T,d;int k;while(cin>>A>>B>>C>>k&&(A+B+C+k)){long long n=1LL<<k;//n = 1 * 2^k ;exgcd(C,n,d,x,y);//a*x + b*y = c ,C*x + 2^k * y =B-Aif((B-A)%d!=0)//上面(2)中的性質(zhì)ii{cout<<"FOREVER"<<endl;continue;}x=x*(B-A)/d;T=n/d;x=(x%T+T)%T;cout<<x<<endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的poj 2115 C Looooops(扩展欧几里德算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。