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

#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. Activity中异步操作showDialog异常解决方法:判断Ay是否结束

    Android – Displaying Dialogs From Background Threads 判断一下Activity是否在finishing就好了,否则万一Activity销毁了,这个D ...

  2. iOS iOS9下修改回HTTP模式进行网络请求

    升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...

  3. IOS8 不用计算Cell高度的TableView实现方案

    这个新特性,意味着View被Autolayout调整frame后,会自动拉伸和收缩SupView. 具体到Cell,要求cell.contentView的四条边都与内部元素有约束关系. 在TableV ...

  4. 开源libusb驱动的libwdi驱动安装API库和zadig.exe安装UI应用程序的编译和调试

    一.目的 二.编译环境 系统:Win7 ~ Win10 编译工具:Visual Studio 2008 或 Visual Studio 2010 或Visual Studio 2015 libwdi编 ...

  5. USACO Section 4.3 Buy low,Buy lower(LIS)

    第一眼看到题目,感觉水水的,不就是最长下降子序列嘛!然后写……就呵呵了..要判重,还要高精度……判重我是在计算中加入各种判断.这道题比看上去麻烦一点,但其实还好吧.. #include<cstd ...

  6. Struts学习之自定义拦截器

    * 所有的拦截器都需要实现Interceptor接口或者继承Interceptor接口的扩展实现类    * 要重写init().intercept().destroy()方法        * in ...

  7. Mac 10.7.*安装XCode3.2.6的方法

    1.首先,在Xcode 3.2.6的磁盘映像(dmg文件)上点击右键,选择“磁盘工具”打开,如图1所示,转换成一个可读写的dmg文件,如图2所示. 图1 图2 转换好后双击它,让它在Finder里面显 ...

  8. 基于MDK的ARM-GCC开发环境建立及新唐M0的HID类设备的C++开发

    一,下载安装测试arm-none-eabi-gcc编译工具链 1,查看arm-none-eabi-gcc编译工具版本        打开网页:https://sourcery.mentor.com/G ...

  9. perl 爬取同花顺数据

    use LWP::UserAgent; use utf8; use DBI; $user="root"; $passwd='xxx'; $dbh=""; $db ...

  10. Java中byte转int的方法

    byte转化为int有两种情况: 1)要保持数值不变 应用场景:数值计算.等等. 方法:能够直接採用强制类型转换:int i = (int) aByte, 比如:若aByte=0xff(即数值为-1) ...