結果
| 問題 |
No.3022 一元一次式 mod 1000000000
|
| コンテスト | |
| ユーザー |
ococonomy1
|
| 提出日時 | 2025-02-18 17:08:37 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 158 ms / 2,000 ms |
| コード長 | 3,563 bytes |
| コンパイル時間 | 1,838 ms |
| コンパイル使用メモリ | 198,924 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2025-02-18 17:08:41 |
| 合計ジャッジ時間 | 3,077 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
//#pragma GCC target("avx2")
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
using pli = pair<ll,int>;
#define TEST cerr << "TEST" << endl
#define AMARI 998244353
//#define AMARI 1000000007
#define el '\n'
#define El '\n'
#define YESNO(x) ((x) ? "Yes" : "No")
#define VEC_UNIQ(v) sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end());
#define REV_PRIORITY_QUEUE(tp) priority_queue<tp,vector<tp>,greater<tp>>
//ax + by == gcd(a,b)
//返り値は gcd で、x,yにこれを満たす x,y が入る。関数に渡すときの値はなんでもよい。
//ちなみに、max(absX,absY) <= max(absA,absB) を満たすらしい。すごい。
long long ococo_extgcd(long long a, long long b, long long &x,long long &y){
if(abs(a) < abs(b)) {
swap(a,b);
swap(x,y);
}
if(!b){
x = 1; y = 0;
return a;
}
ll ans = ococo_extgcd(b,a % b,x,y);
ll temp = x;
x = y;
y = temp - (a / b) * y;
return ans;
}
//数 N のトーシェント関数を求める。
//O(sqrt(N)) ただしメモ化をしているため、同じ数が何回も呼ばれる場合は O(log(この関数に出てきた種類数)) になる
//メモ化の log が邪魔な場合は、static map<ll,ll> mp; 周りを消せばよい
ll ococo_totient(ll n){
static map<ll,ll> mp;
if(n == 1)return 1LL;
if(mp.find(n) != mp.end())return mp[n];
ll ans = 1;
for(ll i = 2LL; i * i <= n; i++){
bool first = true;
while(n % i == 0){
n /= i;
if(first)ans *= (i - 1);
else ans *= i;
first = false;
}
}
if(n != 1)ans *= (n - 1);
return mp[n] = ans;
}
ll beki(ll a,ll b,ll md){
ll ans = 1,temp = a % md;
while(b){
if(b % 2){
ans *= temp;
ans %= md;
}
temp *= temp;
temp %= md;
b /= 2;
}
return ans;
}
#define MULTI_TEST_CASE true
void solve(void){
//問題を見たらまず「この問題設定から言えること」をいっぱい言う
//一個回答に繋がりそうな解法が見えても、実装や細かい詰めに時間がかかりそうなら別の方針を考えてみる
//添え字回りで面倒になりそうなときは楽になる言い換えを実装の前にじっくり考える
//ある程度考察しても全然取っ掛かりが見えないときは実験をしてみる
//よりシンプルな問題に言い換えられたら、言い換えた先の問題を自然言語ではっきりと書く
//g++ -D_GLIBCXX_DEBUG -O2 XXX.cpp -o o
ll n,m;
cin >> n >> m;
ll md = 1000000000LL;
n %= md; m %= md;
if(n == 0){
cout << (m == 0 ? 1 : -1) << el;
return;
}
ll x,y;
ll g = ococo_extgcd(n,m,x,y);
g = ococo_extgcd(g,md,x,y);
n /= g;
m /= g;
md /= g;
//(n,m,md) の gcd は 1
if(ococo_extgcd(n,md,x,y) != 1){
cout << -1 << el;
return;
}
//cerr << n << ' ' << m << ' ' << md << el;
ll phi = ococo_totient(md);
ll ans = (md - m) % md;
ans *= beki(n,phi - 1,md); ans %= md;
if(ans == 0)ans += md;
cout << ans << el;
return;
}
void calc(void){
return;
}
signed main(void){
cin.tie(nullptr);
ios::sync_with_stdio(false);
calc();
int t = 1;
if(MULTI_TEST_CASE)cin >> t;
while(t--){
solve();
}
return 0;
}
ococonomy1