题意:
给青蛙和花浇水,,每浇一次水,青蛙的高度变成 (x1*h1+y1)%m ,花的高度变成 (x2*h2+y2)%m,问至少经过多少步花和青蛙的高度等于相应的高度?
输入:
5 4 2 1 1 0 1 2 3
1023 1 2 1 0 1 2 1 1
输出:
3-1
分析:
两者都不能到达相应高度:输出-1;
两者同时到达相应高度,输出任意一个;
不同时,假设其中一个先到,记录他走的步数,将当前的步数作为起点继续下面的步数,下面走的就是循环,并算出循环
的长度,如果在这期间,晚到的那个恰好等于早到加循环走的步数,则输出晚到的步数,否则,则输出-1.
代码:#include <bits/stdc++.h> using namespace std; int main() { //找循环 int flag = 0; long long int m,h1,h2,a1,a2,x1,x2,y1,y2; long long int i,j,k; long long int p1,r1,p2,r2; p1 = p2 = r1 = r2 = -1; cin >>m; cin >>h1>>a1>>x1>>y1; cin >>h2>>a2>>x2>>y2; for(i = 1; i<=2*m; i++) //循环2m次为了找到循环长度为m循环 { h1 = (h1*x1+y1)%m; if(h1 == a1) //可达 { if(p1 == -1) //第一次到达 p1 = i; //记录步数,以当前p1为起点,继续走。 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++) { if(p1<p2) p1+=r1; //加上循环长度 else p2+=r2; if(p1==p2) { printf("%I64d\n",p1); return 0; } } printf("-1\n"); } return 0; }