高斯消元,今天数学死了无数次……

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#define LL __int64
const int maxn=55;
#define mod 200000000000000003LL //不能用const来定义。。,不知道为什么,需要是素数
#define diff 100000000000000000LL //偏移量,使得数都是整数,方便移位乘法
using namespace std;
LL x[maxn], g[maxn][maxn], a[maxn][maxn], b[maxn][maxn];
int n;
LL Mod(LL x)//加法取模,防止超__int64
{
if(x>=mod)
return x-mod;
return x;
}
LL mul(LL a,LL b)//乘法,用移位乘法,同样防止超__int64
{
LL s;
for(s=0;b;b>>=1)
{
if(b&1)
s=Mod(s+a);
a=Mod(a+a);
}
return s;
}
void gcd(LL a,LL b,LL d,LL &x,LL &y)//拓展的欧几里德定理,求ax+by=gcd(a,b)的一个解
{
if(!b){d=a;x=1;y=0;}
else{gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
LL inv(LL a,LL n)//求逆,用于除法
{
LL x,y,d;
gcd(a,n,d,x,y);
return (x%n+n)%n;
}
void Gauss()//高斯消元
{
int i,j,k;
LL v,tmp;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(g[j][i])
break;
}
if(i!=j)
{
for(k=i;k<=n;k++)
swap(g[i][k],g[j][k]);
}
v=inv(g[i][i],mod);
for(j=i+1;j<n;j++)
{
if(g[j][i])
{
tmp=mul(g[j][i],v);//相当于g[j][i]/g[i][i]%mod;
for(k=i;k<=n;k++)
{
g[j][k]-=mul(tmp,g[i][k]);
g[j][k]=(g[j][k]%mod+mod)%mod;
}
}
}
}
//求出所以的解,存入x数组中
for(i=n-1;i>=0;i--)
{
tmp=0;
for(j=i+1;j<n;j++)
{
tmp+=mul(x[j],g[i][j]);
if(tmp>=mod)
tmp-=mod;
}
tmp=g[i][n]-tmp;
tmp=(tmp%mod+mod)%mod;
x[i]=mul(tmp,inv(g[i][i],mod));
}
}
int main()
{
int T,tt=0;
int i,j;
LL tmp;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(g,0,sizeof(g));
memset(b,0,sizeof(b));
for(i=0;i<=n;i++)
{
for(j=0;j<n;j++)
{
scanf("%I64d",&a[i][j]);
a[i][j]+=diff;//偏移diff
b[i][n]+=mul(a[i][j],a[i][j]);
if (b[i][n]>=mod)
b[i][n]-=mod;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
tmp=a[i+1][j]-a[i][j];
tmp=(tmp%mod+mod)%mod;
g[i][j]=mul(tmp,2);
}
g[i][n]=b[i+1][n]-b[i][n];
g[i][n]=(g[i][n]%mod+mod)%mod;
}
Gauss();
printf("Case %d:\n",++tt);
printf("%I64d",x[0]-diff);//减去先前偏移的值。
for (i=1;i<n;i++)
printf(" %I64d",x[i]-diff);
printf("\n");
}
return 0;
}
/*
由题意,列方程组∑(xj-aij)^2=R^2(0<=j<n),共n+1个方程。
存在未知数R,以及二次方,需要降次。逐个与上方方程做差,得到n元一次方程组,共n个方程。
剩下套高斯消元的模板就OK了。
不过这题有几点需要注意:
1.未知数是xi<=1e17,所以无法直接乘除。又∑ai*xi=an和∑ai*xi=an(mod n)(0<=i<=n,xi<n)的解相同
(乘法和加法取余处理下酒能证明)。所以可以%mod来解决。
2.由于需要求逆,所以mod为素数2e17+3。又正常乘法会超过__int64,所以需要用移位乘法。
3.为简单化移位,需要乘数,所以需要添加偏移量diff,根据数学运算可知,只要最后结果减去偏移量即可。
*/

HDU 3571 N-dimensional Sphere的更多相关文章

  1. HDU 3571 N-dimensional Sphere( 高斯消元+ 同余 )

    N-dimensional Sphere Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  2. HDU 3571 N-dimensional Sphere(高斯消元 数论题)

    这道题算是比较综合的了,要用到扩展欧几里得,乘法二分,高斯消元. 看了题解才做出来orz 基本思路是这样,建一个n*(n-1)的行列式,然后高斯消元. 关键就是在建行列式时会暴long long,所以 ...

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

    题目链接 高斯消元详解 /* $Description$ 在n维空间中给定n+1个点,求一个点使得这个点到所有点的距离都为R(R不给出).点的任一坐标|xi|<=1e17. $Solution$ ...

  4. HDU题解索引

    HDU 1000 A + B Problem  I/O HDU 1001 Sum Problem  数学 HDU 1002 A + B Problem II  高精度加法 HDU 1003 Maxsu ...

  5. 高斯消元 分析 && 模板 (转载)

    转载自:http://hi.baidu.com/czyuan_acm/item/dce4e6f8a8c45f13d7ff8cda czyuan 先上模板: /* 用于求整数解得方程组. */ #inc ...

  6. 可用类型的几何对象esriGeometryType Constants

    The available kinds of geometry objects. Constant Value Description esriGeometryNull 0 A geometry of ...

  7. hdu 5727 Necklace dfs+二分图匹配

    Necklace/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5727 Description SJX has 2*N mag ...

  8. HDU 5976 Detachment 打表找规律

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5976 Detachment Time Limit: 4000/2000 MS (Java/Other ...

  9. HDU 5976 Detachment(拆分)

    HDU 5976 Detachment(拆分) 00 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)   Problem D ...

随机推荐

  1. linux grep 指定字符串的正则表达式

    cat all_uuid_log | grep "[a-z0-9]\{32\}"

  2. Jquery 获取IP地址

    //获取ip和地址 $(function () { var url = 'http://chaxun.1616.net/s.php?type=ip&output=json&callba ...

  3. R与数据分析旧笔记(十)非线性模型

    非线性模型 非线性模型 例子:销售额x与流通费率y > x=c(1.5,2.8,4.5,7.5,10.5,13.5,15.1,16.5,19.5,22.5,24.5,26.5)> y=c( ...

  4. Easyui + jQuery表单提交 给 Controller patr1

    2014-11-15  总结上周在公司开发所用到的技术,由于是刚找的工作(一个大三实习生)+自己的技术菜,有很多地方都是怎么想就怎么实现的, 如果你有什么更好的解决方法,在看见这篇博客的时候,希望你能 ...

  5. codeforces 292E. Copying Data 线段树

    题目链接 给两个长度为n的数组, 两种操作. 第一种, 给出x, y, k, 将a[x, x+k-1]这一段复制到b[y, y+k-1]. 第二种, 给出x, 输出b[x]的值. 线段树区间更新单点查 ...

  6. Android 4.0 ProGuard 代码混淆 以及 proguard returned with error code 1.See console异常的解决方法

    最近呢说要上线,就去找了下上线的方法...之前做过代码混淆,用的是progarud.cfg,但是呢自己反编译了之后还是无效,然后就丢着先不管了,因为实在不知道什么情况.今天来上线的时候结果总是报错,总 ...

  7. nodejs服务端开发学习笔记

    正在学习中,不断改错... 学习了一段时间nodejs,对其中的很多东西还不是很理解,在网上看过很多的例子,希望通过自己的一些总结让自己了解的更全面些,同时也作为学习笔记留存备忘. 准备工作 node ...

  8. JavaFx初探

    由于项目的须要,实在是没有办法了,试了非常多种方案(RCP,SWT,Flex,Smartinvoke...),终于还是决定開始研究JavaFx...为了给用户更好地体验我们的"智能家居&qu ...

  9. Android 自己主动化測试之------ Monkey工具

    尽管 一般公司都有专门的測试人员,可是有时候 免不了 我们既要去开发产品,也要去測试产品,測试产品.有些机械化的 点界面的操作,谷歌已经给我们提供了工具.Monkey, 猴子測试. 什么是Monkey ...

  10. css3属性选择器总结

    前两节介绍了css3属性选择器与css2属性选择器中: 包含字符串和以字符串选择器开头的选择器的比较. 全部属性选择器: 包含字符串讲解对比实例讲解链接: http://www.cnblogs.com ...