poj 2115 C Looooops (扩展欧几里得)
来源:互联网 发布:用c语言编写圆的面积 编辑:程序博客网 时间:2024/06/02 21:02
题目大意:给你一个这样的for循环
for( variable = A ; variable != B ; variable += C)
问你这个for循环执行多少次结束,输出循环次数,若循环不能停止则输出FOREVER。
设x为循环执行的次数,则有( A + x * C ) % 2^k = B ,这个式子可化为 ( A + x*C - B ) % 2^k =0 ,所以A + x*C -B 为 2^k 的整数倍。
则有 A + x*C -B = t * 2^k ,移项得 x*C - t * 2^k = B - A ,令y = -t ,a=C ,b=2^k ,c=B-A ,则 a*x + b*y = c ,这个式子用扩展欧几里得求解就好了。
#include <iostream>#include<cstdio>#define ll long longusing namespace std;void exgcd(ll a,ll b,ll &d,ll &x,ll &y){ if(!b) {d=a;x=1;y=0;} else {exgcd(b,a%b,d,y,x);y-=x*(a/b);}}int main(){ ll A,B,C,k; ll a,b,c,d,x,y; while(scanf("%I64d%I64d%I64d%I64d",&A,&B,&C,&k)) { if(!A && !B && !C && !k) break; if(C==0 && A!=B) //如果C等于0,A不等于B,则永远不会停止 { printf("FOREVER\n"); continue; } c=B-A; a=C; b=1LL<<k;//这里的1LL是long long类型的1,如果不这么写当k=32的时候会溢出 exgcd(a,b,d,x,y); if(c%d) { printf("FOREVER\n"); continue; } b=b/d; x=c/d*x; printf("%I64d\n",(x%b+b)%b); } return 0;}
0 0
- poj-2115 C Looooops(扩展欧几里得)
- poj 2115 C Looooops (扩展欧几里得)
- POJ - 2115 - C Looooops (扩展欧几里得)
- POJ 2115 C Looooops(扩展欧几里得)
- POJ 2115 C Looooops(扩展欧几里得)
- POJ-2115-C Looooops(扩展欧几里得)
- poj 2115 C Looooops (扩展欧几里得)
- 【POJ】2115 - C Looooops(扩展欧几里得)
- POJ 2115 C Looooops (扩展欧几里得)
- POJ 2115 C Looooops(扩展欧几里得)
- poj 2115 C Looooops(扩展欧几里得)
- POJ 2115 C Looooops 扩展欧几里得算法
- poj 2115 C Looooops 扩展欧几里得
- poj 2115 C Looooops 【扩展欧几里得】
- POJ 2115 C Looooops (扩展欧几里得)
- poj 2115 C Looooops (扩展欧几里得算法)
- C Looooops poj 2115 扩展欧几里得
- [poj 2115] C Looooops 扩展欧几里得
- Custom Container View Controller
- 启用HAProxy状态监控
- C语言中参数的传递方式
- HDU4893 Wow! Such Sequence!
- VMware 组网基本原理
- poj 2115 C Looooops (扩展欧几里得)
- Sql性能优化(一)
- 哈密顿绕行世界问题
- leetcode word ladder 2
- UVA-111 History Grading
- ListView的HeaderView
- Node.js的实践总结
- HDU 4891 The Great Pan(模拟)
- 剑指offer-13:在O(1)时间删除链表结点