Codeforces548C:Mike and Frog

Note

In the first sample, heights sequences are following:

Xaniar:

Abol:

题意:

给出公式(h*x+y)%m,然后分别给出两个物体的a,h,x,y,问通过公式,,两个物体能否同时到达a1和a2

思路:

本题的关键还是在于求循环节

#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <bitset>#include <algorithm>#include <climits>using namespace std;#define LS 2*i#define RS 2*i+1#define UP(i,x,y) for(i=x;i<=y;i++)#define DOWN(i,x,y) for(i=x;i>=y;i–)#define MEM(a,x) memset(a,x,sizeof(a))#define W(a) while(a)#define gcd(a,b) __gcd(a,b)#define LL long long#define N 200005#define MOD 1000000007#define INF 0x3f3f3f3f#define EXP 1e-8#define lowbit(x) (x&-x)int main(){LL flag = 0;LL m,h1,h2,a1,a2,x1,x2,y1,y2;LL i,j,k;LL p1,r1,p2,r2;p1 = p2 = r1 = r2 = -1;scanf("%I64d",&m);scanf("%I64d%I64d%I64d%I64d",&h1,&a1,&x1,&y1);scanf("%I64d%I64d%I64d%I64d",&h2,&a2,&x2,&y2);for(i = 1; i<=2*m; i++){h1 = (h1*x1+y1)%m;if(h1 == a1){if(p1 == -1)p1 = i;//起点else if(r1 == -1)r1 = i-p1;//循环长度}h2 = (h2*x2+y2)%m;if(h2 == a2){if(p2 == -1)p2 = i;else if(r2 == -1)r2 = i-p2;}}if(p1 == -1 || p2 == -1)printf("-1\n");else if(p1 == p2)printf("%I64d\n",p1);else{for(i = 1; i<=2*m; i++)//因为循环节最长也不过m,所以枚举2*m就{if(p1<p2)p1+=r1;elsep2+=r2;if(p1==p2){printf("%I64d\n",p1);return 0;}}printf("-1\n");}return 0;}

少吃点,吃好的。

Codeforces548C:Mike and Frog

相关文章:

你感兴趣的文章:

标签云: