标签:codeforces 简单模拟
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; }
标签:codeforces 简单模拟
原文地址:http://blog.csdn.net/u014800748/article/details/46128275