CodeForces 547A--找循环节

来源:互联网 发布:土木工程翻译软件 编辑:程序博客网 时间:2024/06/05 22:42

题意:

给青蛙和花浇水,,每浇一次水,青蛙的高度变成 (x1*h1+y1)%m ,花的高度变成 (x2*h2+y2)%m,问至少经过多少步花和青蛙的高度等于相应的高度?


输入:

54 21 10 12 3
10231 21 01 21 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;}

0 0
原创粉丝点击