「日常訓練」 Mike and Frog (CFR305D2C)

題意與分析 (Codeforces 548C)

我開始以爲是一條數學題,死活不知道怎麼做,無奈看題解,才知這是一條暴力,思維江化了- -
題意大概是這樣的:
兩個東西的初始高度分別爲h1,h2 ,每秒二者的高度分別變化爲(x1h1+y1)%m1(x2h2+y2)%m2 ,問幾秒後二者高度達到各自的目標a1,a2 ,如果不能輸出-1。
實際上我看了題解還是不能明白爲什麼迭代2m 次,或者說2*…這個變量爲什麼是m。2這個係數能夠理解,我們需要找出循環節;但是爲什麼是m看了半天還是不能明白。我去看看擴展gcd算法的相關題目來找找思路。
總而言之,迭代這麼多次,如果他們不能達到各自的目標輸出-1。否則一定有解。我們前面的係數2保證了至少能達到2次a ,然後找到其中的週期,之後暴力跑一段(取一個很大的數字,我這裏有可能被hack),看能不能達到一致即可。
不能輸出-1。
總而言之,這是用到了數學結論、披着數學外衣、但是本質是暴力的一道題目。希望自己能夠將暴力和數學融會貫通。

代碼

#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO                  \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0);
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pi = pair<int,int>;
const int MAXN=500;
// After reading the editorial.

int main()
{
QUICKIO
    ll m,h1,a1,x1,y1,h2,a2,x2,y2;
    cin>>m>>h1>>a1>>x1>>y1>>h2>>a2>>x2>>y2;
    ll start1=h1,start2=h2;
    vector<ll> time1,time2;
    rep(i,0,2*m) // why 2*m? we need a zhouqi!
    {
        if(start1==a1)
            time1.PB(i);
        if(start2==a2)
            time2.PB(i);
        start1=(start1*x1+y1)%m;
        start2=(start2*x2+y2)%m;
    }
    if(time1.size()==0 || time2.size()==0)
    {
        cout<<"-1"<<endl;
        return 0;
    }
    ll  period1=time1[1]-time1[0],
        period2=time2[1]-time2[0],
        go1=time1[0],
        go2=time2[0];
    //cout<<period1<<" "<<period2<<" "<<go1<<" "<<go2<<endl;
    rep(i,1,2*m) // I dont know why 2m O_O 
    {
        if(go1==go2)
        {
            cout<<go1<<endl;
            return 0;
        }
        if(go1<go2)
            go1+=period1;
        else go2+=period2;
    }
    cout<<-1<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章