#305 (div.2) C. Mike and Frog

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,简单模拟)