#53616: 好難 要用同餘


Tino961009 (能AC,就別管怎麼AC)

學校 : 國立臺中第二高級中學
編號 : 288138
來源 : [111.82.100.143]
最後登入時間 :
2025-10-11 12:15:02

超難

程式碼反白了 建議先研究會了再用

#include <bits/stdc++.h>
using namespace std;
using int64 = long long;

int64 modmul(int64 a, int64 b, int64 mod){
    return (int64)((__int128)a * b % mod);
}

int64 modpow(int64 a, long long e, int64 mod){
    int64 res = 1 % mod;
    a %= mod;
    while(e){
        if(e & 1) res = modmul(res, a, mod);
        a = modmul(a, a, mod);
        e >>= 1;
    }
    return res;
}

// 擴展 gcd(用 __int128 做中間運算以避免溢位)
int64 egcd(int64 a, int64 b, int64 &x, int64 &y){
    if(b == 0){
        x = 1; y = 0;
        return a;
    }
    int64 x1, y1;
    int64 g = egcd(b, a % b, x1, y1);
    __int128 t = (__int128)(a / b) * (__int128)y1;
    x = y1;
    __int128 yy = (__int128)x1 - t;
    y = (int64)yy;
    return g;
}

int64 modinv(int64 a, int64 mod){
    int64 x, y;
    int64 g = egcd(a, mod, x, y);
    if(g != 1) return -1;
    x %= mod;
    if(x < 0) x += mod;
    return x;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    if(!(cin >> T)) return 0;
    while(T--){
        long long n, m, l;
        cin >> n >> m >> l; 
        int64 mod = n + 1;
        int64 pow2 = modpow(2, m, mod);       
        int64 inv = modinv(pow2, mod);       
      
        int64 ans = modmul(l % mod, inv, mod);
     
        if(ans == 0) ans = mod; 
        cout << ans << '\n';
    }
    return 0;
}