Try   HackMD

長い数列解説

原案: olphe, 解説: qLethon

N>M であれば,答えは Yes になります.なぜなら,
M
で割ったあまりは
M
種類しかないので,少なくとも 1 つは
vivj(modM)
となる
i,j (i<j)
があるからです(鳩の巣原理).

NM の場合は愚直に数列を作れば良いので,bool 型の配列などで重複を管理することで 1 つのテストケースあたり
O(M)
で解けます.

実際には,愚直に数列を作っていき,途中で重複が見つかったら答えを出力することにより,先述の場合分けが不要になります.

#include <bits/stdc++.h>

using namespace std;

void solve(){
    int n, m, v, a, b;
    cin >> n >> m >> v >> a >> b;

    vector<bool> used(m);
    used[v % m] = true;
    for (int i = 2; i <= n; i++){
        v = a * v + b;
        v %= m;
        if (used[v]){
            puts("Yes");
            return;
        }
        used[v] = true;
    }

    puts("No");
}

int main(){
    int t;
    cin >> t;
    while (t--){
        solve();
    }