結果

問題 No.3365 Prefix and Suffix X
コンテスト
ユーザー hirakuuuu
提出日時 2025-11-17 23:51:58
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 2,646 bytes
コンパイル時間 5,891 ms
コンパイル使用メモリ 337,772 KB
実行使用メモリ 19,144 KB
最終ジャッジ日時 2025-11-17 23:52:11
合計ジャッジ時間 13,057 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 1
other TLE * 1 -- * 29
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
#define rep(i, a, n) for(int i = a; i < n; i++)
#define rrep(i, a, n) for(int i = a; i >= n; i--)
#define inr(l, x, r) (l <= x && x < r)
#define ll long long
#define ld long double

// using mint = modint1000000007;
using mint = modint998244353;
constexpr int IINF = 1001001001;
constexpr ll INF = 1e18;

template<class t,class u> void chmax(t&a,u b){if(a<b)a=b;}
template<class t,class u> void chmin(t&a,u b){if(b<a)a=b;}

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

ll mod_pow(ll a, ll b, ll m){
    ll res = 1;
    while(b > 0){
        if(b%2 == 1) res = res*a%m;
        a = a*a%m;
        b /= 2;
    }
    return res;
}

ll gcd(ll a, ll b){
    if(a%b == 0) return b;
    else return gcd(b, a%b);
}

ll euler_phi(ll n) {
  ll ret = n;
  for(ll i = 2; i * i <= n; i++) {
    if(n % i == 0) {
      ret -= ret / i;
      while(n % i == 0) n /= i;
    }
  }
  if(n > 1) ret -= ret / n;
  return ret;
}


int main(){
    int t; cin >> t;
    while(t--){
        ll x, m; cin >> x >> m;
        string sx = to_string(x);
        int n = (int)sx.size();
        
        ll ans = -1;
        rep(i, 1, n+1){
            bool f = true;
            rep(j, 0, i){
                if(sx[(n-i)+j] != sx[j]) f = false;
            }
            if(f){
                ll num = x;
                int ten = 1;
                rep(j, 0, n) ten *= 10;
                rrep(j, n-1-i, 0) num += ten*(sx[j]-'0'), ten *= 10;
                if(num%m == 0) ans = num;
            }
        }

        ll ten = 1;
        rep(_, 0, n) ten *= 10;
        ll ten_ = ten;
        ll g = gcd(m, ten_);
        ll a = ten_/g;
        ll b = m/g;
        ll ep = mod_pow(a, euler_phi(b)-1, b);

        rep(i, 2*n, 19){
            if(ans != -1) break;
            ll k = x+x*ten;
            ll tmp = ((-k)%m+m)%m;
            // cout << i-2*n << ' ' << tmp << endl;
            if(m == g){
                if(tmp == 0) ans = k;
            }else if(tmp%g == 0){

                tmp /= g;
                // x \equiv tmp*mod_pow(a, b-2);
                ll y = (tmp*ep)%b;
                // cout << (mod_pow(a, euler_phi(b)-1, b)*a)%b << endl;
                // assert((mod_pow(a, euler_phi(b)-1, b)*a)%b == 1);
                // cout << i-2*n << ' ' << y << endl;
                if(y == 0 || to_string(y).size() <= i-2*n){
                    ans = k+y*ten_;
                }
            }
            ten *= 10;

        }
        assert(ans == -1 || ans%m == 0);
        cout << ans << endl;
    }

    return 0;
}
0