HDU3571 N-dimensional Sphere(高斯消元 同模方程)

每个点到中心距离相等,以第0个点为参考,其他n个点到中心距等于点0到中心距,故可列n个方程

列出等式后二次未知数相消,得到线性方程组

将每个数加上1e17,求答案是再减去,求解时对一个2 * (1e17)以上的一个素数取模。

可用java 中高精度  System.out.println(BigInteger.valueOf(200000000000000001L).nextProbablePrime())  求一个大于2 * (1e17)的质数。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<utility>
using namespace std;

typedef long long LL;
const LL MOD = 200000000000000003ll, M = 100000000000000000ll;
const int N = 60;

//System.out.println(BigInteger.valueOf(200000000000000001L).nextProbablePrime());
LL a[N][N];
LL MultMod(LL a,LL b){
    a%=MOD;
    b%=MOD;
    LL ret=0;
    while(b){
        if(b&1){
            ret+=a;
            if(ret>=MOD) ret-=MOD;
        }
        a=a<<1;
        if(a>=MOD) a-=MOD;
        b=b>>1;
    }
    return (ret % MOD + MOD) % MOD;
}
LL Ext_gcd(LL a,LL b,LL &x,LL &y){//扩展欧几里得
   if(b==0) { x=1, y=0; return a; }
   LL ret= Ext_gcd(b,a%b,y,x);
   y-= a/b*x;
   return ret;
}
LL Inv(LL a, LL m){   ///求逆元
   LL d,x,y, t = m;
   d= Ext_gcd(a,t,x,y);
   if(d==1) return (x%t+t)%t;
   return -1;
}

void gauss_jordan(LL A[][N], int n){
    for(int i = 0; i < n; i++){
        //选择一行r与第i行交换
        int r = i;
        for(int j = i; j < n; j++){
            if(A[j][i]){
                r = j;
                break;
            }
        }
        if(r != i){
            for(int j = 0; j <= n; j++){
                swap(A[r][j], A[i][j]);
            }
        }
        for(int k = i + 1; k < n; k++){
            if(A[k][i]){
                LL x1 = A[k][i], x2 = A[i][i];
                for(int j = n; j >= i; j--){
                    A[k][j] = ((MultMod(A[k][j],  x2) - MultMod(x1, A[i][j])) % MOD + MOD) % MOD;
                }
            }
        }
    }
    for(int i = n - 1; i >= 0; i--){
        for(int j = i + 1; j < n; j++){
            if(A[i][j]){
                A[i][n] -= MultMod(A[j][n], A[i][j]);
                if(A[i][n] < 0){
                    A[i][n] += MOD;
                }
            }
        }
        A[i][n] = MultMod(A[i][n], Inv(A[i][i], MOD));
    }
}

LL x[N];
int main(){
    int t;
    cin>>t;
    for(int cas = 1; cas <= t; cas++){
        int n;
        cin>>n;
        for(int i = 0; i < n; i++){
            cin >> x[i];
            x[i] += M;
        }
        for(int i = 0; i < n; i++){
            a[i][n] = 0;
            for(int j = 0; j < n; j++){
                LL t;
                cin >>t;
                t += M;
                a[i][n] += (MultMod(t, t) - MultMod(x[j], x[j]) + MOD) % MOD;
                a[i][n] %= MOD;
                a[i][j] = ((2 * t - 2 * x[j]) % MOD + MOD) % MOD;
            }
        }
        gauss_jordan(a, n);
        printf("Case %d:\n", cas);
        for(int i = 0; i < n - 1; i++){
            printf("%I64d ", a[i][n] - M);

        }
        printf("%I64d\n", a[n - 1][n] - M);

    }
    return 0;
}

  

时间: 2024-10-10 10:15:15

HDU3571 N-dimensional Sphere(高斯消元 同模方程)的相关文章

lydsy1013: [JSOI2008]球形空间产生器sphere 高斯消元

题链:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 1013: [JSOI2008]球形空间产生器sphere 时间限制: 1 Sec  内存限制: 162 MB 提交: 3063  解决: 1607 [提交][][] 题目描述 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. 输入 第一行

【BZOJ 1013】【JSOI2008】球形空间产生器sphere 高斯消元基础题

最基础的高斯消元了,然而我把j打成i连WA连跪,考场上再犯这种错误就真的得滚粗了. #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define for1(i,a,n) for(int i=(a);i<=(n);++i) #define for2(i,a,n) for(int i=(a);i<(n);++i) #define for3(i,a,n) f

BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元

题目大意:给定n维空间下的n+1个点,求这n个点所在的球面的球心 曾经尝试了很久的模拟退火0.0 至今仍未AC 0.0 今天挖粪涂墙怒学了高斯消元-- 我们设球心为X(x1,x2,...,xn) 假设有两点A(a1,a2,...,an)和B(b1,b2,...,bn) 那么我们可以得到两个方程 (x1-a1)^2+(x2-a2)^2+...+(xn-an)^2=r^2 (x1-b1)^2+(x2-b2)^2+...+(xn-bn)^2=r^2 这些方程都是二次的,无法套用高斯消元 但是我们可以做

[BZOJ1013] [JSOI2008] 球形空间产生器sphere (高斯消元)

Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. Input 第一行是一个整数n(1<=N=10).接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标.每一个实数精确到小数点后6位,且其绝对值都不超过20000. Output 有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开.每个实数精确到

HDU.3571.N-dimensional Sphere(高斯消元 模线性方程组)

题目链接 高斯消元详解 /* $Description$ 在n维空间中给定n+1个点,求一个点使得这个点到所有点的距离都为R(R不给出).点的任一坐标|xi|<=1e17. $Solution$ 根据题意可以列出n+1个二元n次方程,相邻的方程相减可以把二次项和R全部约掉,得到n个一元n次方程. 但需要注意这题数据量较大,最大的可能解范围为1e17,如果利用大数(高精...) 乘法的复杂度会很高 可以采用同余的方法,所有运算需要模一个足够大的素数(>1e17),可以用Miller_Rabin生

POJ2065 SETI(高斯消元 同模方程)

(a1 * 1^0  +   a2 * 1^1  + ...  an * 1^n - 1) % P = f1 .... (a1 * n^0  +   a2 * n^1  + ...  an - 1 * n ^ n - 1) % P = fn 消元中A[k][i] % A[i][i]不为0时将A[k][i]变为他们的最小公倍数,即整行都乘上lcm(A[k][i], A[i][i]) / A[k][i],回代求解时使用逆元 #include<cstdio> #include<iostream

bzoj 1013 [JSOI2008]球形空间产生器sphere(高斯消元)

1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3584  Solved: 1863[Submit][Status][Discuss] Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. Input 第一行是一个整数,n.接

【高斯消元】【JSOI 2008】【bzoj 1013】球形空间产生器sphere

1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3211 Solved: 1685 Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. Input 第一行是一个整数,n.接下来的n+1行,每行有n个实数,表示球面上一点的n维

BZOJ 1013 [JSOI2008]球形空间产生器sphere 【高斯消元】

Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. HINT 1<=n<=10 提示:给出两个定义:1. 球心:到球面上任意一点距离都相等的点.2. 距离:设两个n为空间上的点A, B的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 +