HDU 3571 N-dimensional Sphere(高斯消元 数论题)
这道题算是比较综合的了,要用到扩展欧几里得,乘法二分,高斯消元。
看了题解才做出来orz
基本思路是这样,建一个n*(n-1)的行列式,然后高斯消元。
关键就是在建行列式时会暴long long,所以要用取模来计算,即公式ax=b,等价于ax=b(mod p)
因为答案范围不超过正负10^17次,p可以取(2*10^17+3)。
然后加减乘除都能够进行了,乘法用乘法二分来做,除法用模线性方程求逆来做。
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define LL __int64
const LL p=(LL)200000000*1000000000+3;//杭电的编译器不能直接写200000000000000003,会ce
const LL L=(LL)100000000*1000000000;
LL ans[60],a[60][60],h[60][60];
int n;
LL modans(LL s)//取模
{
if(s<0)
s=s+p;
else if(s>=p)
s=s-p;
return s;
}
LL calcu(LL base,LL tmp)//乘法二分
{
LL ans=0;
while(tmp)
{
if(tmp&1)ans=modans(ans+base);
base=modans(base*2);
tmp/=2;
}
return ans;
}
void get_h(int s)//每一行初始化
{
int i,j;
LL tmp=0;
for(i=0;i<n;i++)
{
h[s][i]=modans(2*(a[s][i]-a[s+1][i]));
tmp+=calcu(a[s][i],a[s][i])-calcu(a[s+1][i],a[s+1][i]);
tmp=modans(tmp);
//printf("%I64d ",h[s][i]);
}
h[s][n]=tmp;
//printf("%I64d\n",h[s][n]);
}
void init()
{
int i,j;
for(i=0;i<n;i++)
get_h(i);
}
LL extEculid(LL a,LL b,LL &x,LL &y)
{
LL tmp,d;
if(b==0){x=1;y=0;return a;}
d=extEculid(b,a%b,x,y);
tmp=x;x=y;y=tmp-a/b*y;
return d;
}
void solve()
{
int i,j,k;
for(i=0;i<n;i++)//这一步不能落下,当第i行第i个数是0时,要与下面的行互换。这题数据貌似有点水,要是互换后第i个数还是0,就会出错了。。。
{
for(j=0;j<n;j++)
if(h[i][j])
break;
if(i<j)
{
for(k=0;k<=n;k++)
swap(h[i][k],h[j][k]);
}
}
for(i=0;i<n-1;i++)
{ for(j=i+1;j<n;j++)
{
int tmp=h[i][j];
for(k=i+1;k<=n;k++)
h[j][k]=modans(calcu(h[j][k],h[i][i])-calcu(h[i][k],h[j][i]));
}
}
LL x,y,g;
for(i=n-1;i>=0;i--)
{
g=extEculid(h[i][i],p,x,y);//由于p是质数,所以g实际上等于1
ans[i]=calcu(x,h[i][n]);
for(j=0;j<i;j++)
h[j][n]=modans(h[j][n]-calcu(h[j][i],ans[i]));
}
}
int main()
{
int t,i,j;
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
scanf("%d",&n);
for(i=0;i<=n;i++)
for(j=0;j<n;j++)
{
scanf("%I64d",&a[i][j]);
a[i][j]+=L;
}
init();
solve();
printf("Case %d:\n",k);
printf("%I64d",(ans[0]-L)%L);
for(i=1;i<n;i++)
printf(" %I64d",(ans[i]-L)%L);
printf("\n");
}
return 0;
}
HDU 3571 N-dimensional Sphere(高斯消元 数论题)的更多相关文章
- HDU 3571 N-dimensional Sphere( 高斯消元+ 同余 )
N-dimensional Sphere Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- HDU.3571.N-dimensional Sphere(高斯消元 模线性方程组)
题目链接 高斯消元详解 /* $Description$ 在n维空间中给定n+1个点,求一个点使得这个点到所有点的距离都为R(R不给出).点的任一坐标|xi|<=1e17. $Solution$ ...
- BZOJ-1013 球形空间产生器sphere 高斯消元+数论推公式
1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3662 Solved: 1910 [Subm ...
- BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
1013: [JSOI2008]球形空间产生器sphere Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/Judg ...
- HDU 5755 Gambler Bo(高斯消元)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5755 [题目大意] 一个n*m由0,1,2组成的矩阵,每次操作可以选取一个方格,使得它加上2之后对 ...
- HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4818 深深地补一个坑~~~ 现场赛坑在这题了,TAT.... 今天把代码改了下,过掉了,TAT 很明显 ...
- ACM学习历程—HDU 3949 XOR(xor高斯消元)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 题目大意是给n个数,然后随便取几个数求xor和,求第k小的.(重复不计算) 首先想把所有xor的 ...
- lydsy1013: [JSOI2008]球形空间产生器sphere 高斯消元
题链:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 1013: [JSOI2008]球形空间产生器sphere 时间限制: 1 Sec 内 ...
- [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...
随机推荐
- 使用 jackson序列格式化日期
[1]自定义时间,序列化类 [java] view plaincopy package com.fsti.bm.utils; import java.io.IOException; import ja ...
- 基于visual Studio2013解决C语言竞赛题之1024求和
题目 解决代码及点评 /* 已知有N个无规律的正整数,请编程序求出其中的素数并打印出能被5整除的数之积. */ #include <stdio.h> # ...
- zoj 1730 / poj 1455 Crazy Tea Party
这阵子都没怎么写代码,由于开学,忙于各种琐碎的事情,现在静下来了开始跟着暑假的节奏刷题了. 这道题一开是没看清题目-在寝室刷题就是效率不高... 后来才知道,题目意思是,一个环形序列,1minute可 ...
- if(男深圳集体户口&&女非深圳户口)深圳准生证办理材料及流程
所需材料 一.女方需要办理流动人口婚育证明(蓝色的小本本). 办理材料.各地可能不同.这个是在女方的户籍所在地办理(最好在女方户籍所在地办理女方初婚未育证明). 二.男方在公司开出初婚未育证明. 三. ...
- Java Swing界面编程(22)---事件处理:动作事件及监听处理
要想让一个button变得有意义,就必须使用事件处理.在swing的事件处理中.能够使用ActionListener接口处理button的动作事件. package com.beyole.util; ...
- TCP与UDP在socket编程中的区别 (网络收集转载)
http://blog.chinaunix.net/uid-26421509-id-3814684.html 一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) ...
- GDI+: Curved Shapes
原文 http://www.functionx.com/vcsharp2003/gdi/curves.htm Curves Introduction to Curves A curve is ...
- shell程序设计(转)
1.shell脚本的基本概念: (1)Shell执行的是称为shell程序,这些程序通常被称为脚本. (2)Shell是一个用户和系统间接口的程序,它允许用户向操作系统输入需要执行的命令. (3)sh ...
- 软考之路(四)---软件project一 概念模型,逻辑模型,物理模型
自从接触到数据库到如今这三个概念大家理解的还有些不清楚,今天来为大家解答疑惑,共同提高,结合生活理解 概念模型 概念模型就是在了解了用户的需求,用户的业务领域工作情况以后,经过分析和总结 ...
- 如果一个Object对象可能是数组那么如何对其进行迭代
需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是基本类型数组,也可能是对象数组,如何将这个 ...