POJ2115 C Looooops(拓展欧几里德)

来源:互联网 发布:h3c路由器封端口 编辑:程序博客网 时间:2024/05/22 00:38

题意:

要求a不断加c到达b,如果a大于2^k就mod2^k,求最少要加几次c。

要点:

拓展欧几里德算法求最小整数解,就是个模板。不过要注意计算2^k时因为超出int范围所以必须先强制类型转换:(__int64)1 << k。


15409053Seasonal2115Accepted164K0MSC++633B2016-04-19 09:20:54

#include<stdio.h>#include<string.h>#include<stdlib.h>__int64 e_gcd(__int64 a, __int64 b, __int64 &x, __int64 &y){__int64 ans, temp;if (b == 0){x = 1; y = 0;return a;}ans = e_gcd(b, a%b, x, y);temp = x;x = y;y = temp - a / b*y;return ans;}int main(){__int64 a, b, c,d,k,xx,yy,r,num;while (scanf("%I64d%I64d%I64d%I64d", &a, &b, &c, &k)){if (!a && !b && !c && !k)break;num = (__int64)1 << k;//这里要强制类型转换,毕竟有个1不是__int64型的d = e_gcd(c, num, xx, yy);if ((b - a) % d != 0)printf("FOREVER\n");else{xx *= (b - a) / d;r = num / d;xx = (xx%r + r) % r;printf("%I64d\n", xx);}}return 0;}


0 0
原创粉丝点击