您的位置:首页 > 其它

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

2016-07-26 10:57 363 查看
题目地址: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: