POJ2115-C Looooops【扩欧,同余】
生活随笔
收集整理的這篇文章主要介紹了
POJ2115-C Looooops【扩欧,同余】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正題
鏈接:
http://poj.org/problem?id=2115
大意
就是給出個(gè)循環(huán)
for(i=A;i!=B;i=(i+C)mod2k)for(i=A;i!=B;i=(i+C)mod2k)
求需要循環(huán)次數(shù)
解題思路
我們定義l=2kl=2k
首先可以推出:
Cx+A≡B(modl)Cx+A≡B(modl)
然后解mod
Cx+A=B+lkCx+A=B+lk
然后定義y=?ly=?l,移項(xiàng)
Cx+ly=B?ACx+ly=B?A
然后我們定義d=gcd(C,l)d=gcd(C,l),之后同時(shí)除去d
Cx/d+ly/d=(A?B)/dCx/d+ly/d=(A?B)/d
因?yàn)閐是C和l的最大公約數(shù)那么因?yàn)?span id="ze8trgl8bvbq" class="MathJax_Preview" style="color: inherit; display: none;">CC%d=0d=0,ll%d=0d=0,所以只要(A?B)(A?B)%d=0d=0這個(gè)方程就有解
之后因?yàn)檫@樣求出的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));} }總結(jié)
以上是生活随笔為你收集整理的POJ2115-C Looooops【扩欧,同余】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冒险岛怪物公园怎么去
- 下一篇: 清明节用英语怎么说 清明节的英文怎么翻译