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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 2115 C Looooops(扩展欧几里得)

發布時間:2023/12/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 2115 C Looooops(扩展欧几里得) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

輾轉相除法(歐幾里得算法)

時間復雜度:在O(logmax(a, b))以內

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

  

擴展歐幾里得算法

時間復雜度和歐幾里得算法相同

int extgcd(int a, int b, int& x, int& y) {int d = a;if (b != 0) {d = extgcd(b, a % b, y, x);y -= (a / b) * x;} else {x = 1; y = 0;}return d; }

用于求ax+by=gcd(a,b)整數解,xy返回整數解,extgcd的返回值是ax+by的值。

題目:(A+x*C)%2^k=B 求x整數解。
解析:
x*C=B-A 的在mod(2^k)情況下的整數解
可以轉化成x*C+y*(2^k)=B-A的解
通過擴展歐幾里得算法求出x1*C+y1*(2^k)=gcd(c,2^k)的解x1,y1,d=x1*C+y1*(2^k)=gcd(c,2^k)
x1*C+y1*(2^k)=(B-A)(gcd(c,2^k)/(B-A))
(A-B)/gcd(c,2^k)*x1*C+(A-B)/gcd(c,2^k)*y1*(2^k)=B-A
x=(A-B)/gcd(c,2^k)*x1
y=(A-B)/gcd(c,2^k)*y1
要求的值為x,x可能是負數,所以要把x變到正整數。通過+(2^k)/d 再%(2^k)/d來變成正數。

?

#include <cstdio>long long extgcd(long long a, long long b, long long& x, long long& y) {long long d = a;if (b != 0) {d = extgcd(b, a % b, y, x);y -= (a / b) * x;} else {x = 1; y = 0;}return d; }int main() {long long a, b, c, k;while (scanf("%lld%lld%lld%lld", &a, &b, &c, &k) != EOF) {if (a == 0 && b == 0 && c == 0 && k == 0) break;long long x, y;long long t = b - a;long long h = 1LL << k;  //2^klong long g = extgcd(c, h, x, y);if (t % g != 0) {      //no solutionprintf("FOREVER\n");continue;}x *= t / g;x = (x % (h / g) + (h / g)) % (h / g);//最小非負整數解printf("%lld\n", x);}return 0; }

  

轉載于:https://www.cnblogs.com/wenruo/p/4678856.html

總結

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

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