题意:一个人有个青蛙和花,青蛙高h1,花高h2
这个人浇水给青蛙和花
青蛙每秒高度变化为h1=x1*h1+y1
花同理,问什么时候h1==a1&&h2==a2
思路:
如果可以达到目标 那么
先找到循环节,最坏情况下,m秒内会h1==a1,找到循环节最坏需要2*m秒
然后找到sta1是青蛙第一次到达a1的时间,len1是循环节
我们要找到i*a1+sta1==i*a2+sta2,这个因为abs(sta1-sta2)<=m,所以最坏情况下循环m次会找到答案
因为我们这个循环每次只加单方面的1次,所以1~2*m
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<map>
#include<set>
using namespace std;
typedef long long LL;
#define maxn 1005
#define f(x) (x*1.0)
#define inf 0x3f3f3f3f
#define maxm maxn*maxn
#define lowbit(x) (x&(-x))
#define cheak(i) printf("%d ",i)
#define lson(x) (splay[x].son[0])
#define rson(x) (splay[x].son[1])
#define rfor(i,a,b) for(i=a;i<=b;++i)
#define lfor(i,a,b) for(i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define mec(a,b) memcpy(a,b,sizeof(b))
const double PAI=acos(-1.0);
int main()
{
LL h1,h2,a1,a2,x1,x2,y1,y2;
int m,i;
scanf("%d",&m);
scanf("%lld%lld%lld%lld",&h1,&a1,&x1,&y1);
scanf("%lld%lld%lld%lld",&h2,&a2,&x2,&y2);
LL len1,sta1,len2,sta2;
len1=len2=sta1=sta2=-1;
rfor(i,1,2*m)
{
h1=x1*h1+y1;
h1%=m;
if(h1==a1)
{
if(sta1==-1) sta1=i;
else if(len1==-1) len1=i-sta1;
}
h2=x2*h2+y2;
h2%=m;
if(h2==a2)
{
if(sta2==-1) sta2=i;
else if(len2==-1) len2=i-sta2;
}
}
if(sta1==-1||sta2==-1) printf("-1\n");
else
{
//printf("%lld %lld %lld %lld\n",sta1,sta2,len1,len2);
if(sta1==sta2)
{
printf("%lld\n",sta1);
return 0;
}
rfor(i,1,2*m)
{
if(sta1<sta2) sta1+=len1;
else sta2+=len2;
if(sta1==sta2)
{
printf("%lld\n",sta1);
return 0;
}
}
printf("-1\n");
}
return 0;
}