Codeforces Round #305 (Div. 1) A. Mike and Frog(数学)

来源:互联网 发布:mac系统安装flash 编辑:程序博客网 时间:2024/04/27 12:11

题目地址:http://codeforces.com/problemset/problem/547/A

思路:找循环节。%m的余数有m种,pos1表示a1第一次出现的时间,pos2表示a2第一次出现的时间,l1表示第一个循环长度,l2表示第二个循环长度。循环节长度最大为m,所以最大需模拟2*m次,pos1<pos2时pos1+=l1,反之pos2+=l2。若pos1==pos2,则输出,退出。

#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int m,h1,a1,x1,y1,h2,a2,x2,y2;int main(){    scanf("%d",&m);    scanf("%d%d%d%d",&h1,&a1,&x1,&y1);    scanf("%d%d%d%d",&h2,&a2,&x2,&y2);    long long  pos1=-1,l1=-1;    long long pos2=-1,l2=-1;    for(int i=1; i<=2*m; i++)    {        h1=((long long)h1*x1+y1)%m;        if(h1==a1)        {            if(pos1==-1) pos1=i;            else if(l1==-1) l1=i-pos1;        }    }    for(int i=1; i<=2*m; i++)    {        h2=((long long)h2*x2+y2)%m;        if(h2==a2)        {            if(pos2==-1) pos2=i;            else if(l2==-1) l2=i-pos2;        }    }    if(pos1==-1||pos2==-1) printf("-1\n");    else    {        if(pos1==pos2) printf("%I64d\n",pos1);        else        {            for(int i=1; i<=2*m; i++)            {                if(pos1<pos2) pos1+=l1;                else pos2+=l2;                if(pos1==pos2)                {                    printf("%I64d\n",pos1);                    exit(0);                }            }            printf("-1\n");        }    }    return 0;}


0 0
原创粉丝点击