POJ2115 C Looooops

 1 /*
 2  POJ2115 C Looooops
 3  http://poj.org/problem?id=2115
 4  扩展欧几里得
 5  题意:求x, s.t. (a+c*x)=b (mod 1<<k)
 6         <=> c*x=b-a (mod 1<<k)
 7  */
 8 #include <cstdio>
 9 #include <algorithm>
10 #include <cstring>
11 #include <cmath>
12 #include <vector>
13 #include <queue>
14 #include <iostream>
15 #include <map>
16 #include <set>
17 //#define test
18 using namespace std;
19 const int Nmax=1e6+7;
20 long long a,b,c,k,x,y;
21 long long ex_gcd(long long a,long long b,long long &x,long long &y)//solve x,y in a*x+b*y=ex_gcd(a,b,x,y)=gcd(a,b);
22 {
23     if(b==0)
24     {
25         x=1LL;
26         y=0LL;
27         return a;
28     }
29     long long ans=ex_gcd(b,a%b,x,y);
30     long long tmp=x;
31     x=y;
32     y=tmp-a/b*y;
33     return ans;
34     //x = x0 + (b/gcd)*t
35     //y = y0 – (a/gcd)*t
36      
37 }
38 long long get(long long a,long long m,long long c)//get x in a*x=c(mod m)
39 {
40     //we can solve x,y in a*x+b*y=c <=> c%gcd(a,b)==0
41     long long x,y;
42     long long gcd=ex_gcd(a,m,x,y);
43     if(c%gcd!=0)
44         return -1;//error
45     m/=gcd;
46     x*=c/gcd;
47     if(m<0)
48         m=-m;
49     long long ans=x%m;
50     while(ans<0)
51         ans+=m;
52     return ans;
53 }
54 
55 
56 int main()
57 {
58     #ifdef test
59     #endif
60     //freopen("poj2115.in","r",stdin);
61     while(1)
62     {
63         scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
64         if(!a&&!b&&!c&&!k)
65             break;
66         long long d=b-a;
67         //if(d<0)//即使是负数也不用考虑,可以得出正确答案
68             //d+=(1LL<<k);
69         long long ans=get(c,(1LL<<k),d);
70         if(ans==-1)
71             printf("FOREVER\n");
72         else
73             printf("%lld\n",ans);
74     }
75     return 0;
76 }

 

转载于:https://www.cnblogs.com/BBBob/p/6702238.html

POJ2251是一个经典的题目,也被称为"水仙花的谜题"。该题目要求在一个三维的迷宫中找到从起点到终点的最短路径。 在这个题目中,迷宫由一个3D的数组表示,每个位置上的值代表了该位置的状态。其中,0表示可以通过的路径,1表示墙壁,2表示起点,3表示终点。你需要编写一个程序来找到从起点到终点的最短路径,并输出路径的长度。 解决这个问题的一种常见方法是使用广度优先搜索(BFS)算法。BFS算法可以从起点开始,逐层遍历迷宫中的位置,直到找到终点或者遍历完所有可达位置。在遍历过程中,你需要记录每个位置的距离和路径信息,以便找到最短路径。 以下是解决该问题的大致思路: 1. 定义一个队列,将起点加入队列,并标记起点已访问。 2. 使用循环来遍历队列中的元素,直到队列为空。 3. 在循环中,取出队列中的元素,并获取其相邻可达位置。 4. 对于每个相邻位置,判断是否为终点,如果是则输出最短路径长度并结束程序。 5. 如果不是终点,则判断该位置是否为可通过的路径,并且未被访问过。如果满足条件,则将该位置加入队列,并更新距离和路径信息。 6. 重复步骤2-5,直到找到终点或者遍历完所有可达位置。 这只是一个简单的介绍,实际解决该问题还需要考虑一些细节,比如如何表示迷宫、如何判断位置的合法性等。你可以在编写代码时参考相关的算法和数据结构知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值