POJ-2115

来源:互联网 发布:水泥掺量20 算法 编辑:程序博客网 时间:2024/05/02 06:50
// 356K 0MS G++ #include <stdio.h>#include <string.h>long long EXTENDED_EUCLID(long long a,long long b,long long& x,long long& y)  {      if(b==0)      {          x=1;          y=0;          return a;    }      long long d = EXTENDED_EUCLID(b,a%b,x,y);    long long xt = x;    x=y;    y=xt-a/b*y;    return d;}int main(void){      long long A,B,C,k;    while(scanf("%lld %lld %lld %lld", &A,&B,&C,&k))    {          if(!A && !B && !C && !k) {            break;        }        long long a = C;        long long b = B-A;        long long n = (long long)1<<k;        long long x,y;        long long d = EXTENDED_EUCLID(a,n,x,y);        if (b%d != 0) {            printf("FOREVER\n");        } else {            x = (x*(b/d))%n;            x = (x%(n/d)+n/d)%(n/d);            printf("%lld\n", x);        }    }    return 0;}  


好的题解:

http://blog.csdn.net/lyy289065406/article/details/6648546

数论的题很多完全是靠公式,转化难度其实不大,这道题中,设经过X步C以后,可以从A 到 B,

那么因为存在溢出(溢出在这里其实就是求余了)的情况, 那么有 (A + XC)% 2的K次方 = B, 这是一个模线性等式,其他的参考上面的题解,已经很清楚了.

0 0
原创粉丝点击