1.题目描述:点击打开链接
2.解题思路:本题是一道模拟题,虽然看上去像数学,但实际上只需要模拟一下这个过程就好了。首先,我们先让h1变为a1,设需要k1步才可以,如果h2经过k1步也变为a2,那么直接输出答案。否则,我们接下来找h1变化的循环节cycle,即每经过一个cycle,就可以再到达a1。那么我们看h2需要几个cycle才可以从当前位置(即第k1步时候的位置)到达a2,假设只需要k2步,那么最终的答案就是k2*cycle+k1。
本题的细节比较多,详细过程还需要见注释部分好好理解。
3.代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
typedef pair<long long,long long> PL;
#define me(s) memset(s,0,sizeof(s))
#define For(i,n) for(int i=0;i<(n);i++)
#define pb push_back
#define sz size
#define clr clear
int m;
ll h1,a1,h2,a2,x1,y11,x2,y2;
ll next(ll a,ll x,ll y,ll mod)
{
return (a*x+y)%mod;
}
int main()
{
// freopen("t.txt","r",stdin);
while(cin>>m)
{
cin>>h1>>a1>>x1>>y11;
cin>>h2>>a2>>x2>>y2;
ll k1=0;//假设h1经过k1步可以到达a1
while(h1!=a1&&k1<m+10)//设置最多只能走m+10步,否则认为不可能到达
{
h1=next(h1,x1,y11,m);
h2=next(h2,x2,y2,m);//同时测试h2,看能否在k1步时候也到达
k1++;
}
if(h1!=a1)
{
puts("-1");continue;
}
if(h1==a1&&h2==a2)//直接输出结果
{
cout<<k1<<endl;
continue;
}
int cycle=1;//循环节
h1=next(h1,x1,y11,m);//先走一步
int x=x2,y=y2;//x,y表示的是一次走cycle步的系数
while(h1!=a1&&cycle<m+10)
{
h1=next(h1,x1,y11,m);
x=(x*x2)%m;//可以很方便的通过多项式迭代得到
y=(y*x2+y2)%m;
cycle++;
}
if(h1!=a1)
{
puts("-1");
continue;
}
ll k2=0;//假设可以经过k2个cycle到达a2
while(h2!=a2&&k2<m+10)
{
h2=next(h2,x,y,m);
k2++;
}
if(h2!=a2)
{
puts("-1");
continue;
}
else//最终结果是k2*cycle+k1
{
cout<<k2*cycle+k1<<endl;
}
}
return 0;
}