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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ2115-C Looooops【扩欧,同余】

發布時間:2023/12/3 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ2115-C Looooops【扩欧,同余】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

鏈接:
http://poj.org/problem?id=2115


大意

就是給出個循環

for(i=A;i!=B;i=(i+C)mod2k)for(i=A;i!=B;i=(i+C)mod2k)

求需要循環次數


解題思路

我們定義l=2kl=2k
首先可以推出:

Cx+AB(modl)Cx+A≡B(modl)

然后解mod

Cx+A=B+lkCx+A=B+lk

然后定義y=?ly=?l,移項

Cx+ly=B?ACx+ly=B?A

然后我們定義d=gcd(C,l)d=gcd(C,l),之后同時除去d

Cx/d+ly/d=(A?B)/dCx/d+ly/d=(A?B)/d

因為d是C和l的最大公約數那么因為CC%d=0d=0,ll%d=0d=0,所以只要(A?B)(A?B)%d=0d=0這個方程就有解
之后因為這樣求出的x不是最大解所以我們要:
定義g=(l/d)g=(l/d)
然后

(x?((B?A)/d)(x?((B?A)/d)%g+g)g+g)%gg<script type="math/tex" id="MathJax-Element-28">g</script>

求出最小解


代碼

#include<cstdio> using namespace std; long long x,y,d,a,b,c,k; long long gcdup(long long a,long long b) {if (b==0){x=1;y=0;return a;}d=gcdup(b,a%b);long long k=x;x=y;y=k-a/b*y;return d; } int main() {while (true){scanf("%lld%lld%lld%lld",&a,&b,&c,&k);if (a==0 && b==0 && c==0 && k==0) break;k=1ll<<k;d=gcdup(c,k);if ((b-a)%d) printf("FOREVER\n");else printf("%lld\n",(x*((b-a)/d)%(k/d)+(k/d))%(k/d));} }

總結

以上是生活随笔為你收集整理的POJ2115-C Looooops【扩欧,同余】的全部內容,希望文章能夠幫你解決所遇到的問題。

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