zoukankan      html  css  js  c++  java
  • 高斯消元求主元——模意义下的消元cf1155E

    #include <bits/stdc++.h>
    const int N = 20, MO = 1000003;
    int a[N][N], n = 10;
    inline int qpow(int a, int b) {
        int ans = 1;
        while(b) {
            if(b & 1) {
                ans = 1ll * ans * a % MO;
            }
            a = 1ll * a * a % MO;
            b = b >> 1;
        }
        return ans;
    }
    inline void Gauss() {
        for(int i = 0; i < n; i++) {
            for(int j = i + 1; j <= n; j++) {
                if(a[j][i]) {
                    std::swap(a[j], a[i]);
                    break;
                }
            }
            if(!a[i][i]) continue;
            int inv = qpow(a[i][i], MO - 2);
            for(int j = i + 1; j <= n; j++) {
                if(!a[j][i]) continue;
                int p = 1ll * a[j][i] * inv % MO;
                for(int k = i; k <= n + 1; k++) {
                    a[j][k] -= 1ll * a[i][k] * p % MO;
                    a[j][k] = (a[j][k] % MO + MO) % MO;
                }
            }
        }
        for(int i = n; i > 0; i--) {
            a[i][n + 1] = 1ll * a[i][n + 1] * qpow(a[i][i], MO - 2) % MO;
            a[i][i] = 1;
            for(int j = i - 1; j >= 0; j--) {
                if(!a[j][i]) continue;
                int p = a[j][i];
                a[j][i] -= p;
                a[j][n + 1] -= 1ll * a[i][n + 1] * p % MO;
                a[j][n + 1] = (a[j][n + 1] % MO + MO) % MO;
                a[j][i] = (a[j][i] % MO + MO) % MO;
            }
        }
        return;
    }
    
    inline int cal(int x) {
        int ans = 0, temp = 1;
        for(int i = 0; i <= n; i++) {
            (ans += 1ll * temp * a[i][n + 1] % MO) %= MO;
            temp = 1ll * temp * x % MO;
        }
        return ans;
    }
    int main() {
        for(int i = 0; i <= n; i++) {
            fflush(stdout);
            printf("? %d 
    ", i);
            fflush(stdout);
            scanf("%d", &a[i][n + 1]);
            fflush(stdout);
            a[i][0] = 1;
            for(int j = 1; j <= n; j++) {
                a[i][j] = 1ll * a[i][j - 1] * i % MO;
            }
        }
    
        Gauss();
    
        int ans = -1;
        for(int i = 0; i < MO; i++) {
            if(!cal(i)) {
                ans = i;
                break;
            }
        }
        printf("! %d 
    ", ans);
        return 0;
    }
  • 相关阅读:
    计算机网络基础
    计算机网络之应用层
    计算机网络之传输层
    计算机网络之网络层
    计算机通信之数据链路层
    fastjson =< 1.2.47 反序列化漏洞浅析
    你没有见过的加密
    CTF MD5之守株待兔,你需要找到和系统锁匹配的钥匙
    Redis 4.x 5.x 未授权访问
    redis安装
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10793341.html
Copyright © 2011-2022 走看看