2017湘潭赛 A题 Determinant (高斯消元取模)
链接
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1260
今年湘潭的A题
题意不难
大意是把n*(n+1)矩阵去掉某一列
求去掉那一列之后的对应的行列式的值 mod 1e9+7
思路1 :
先做一次高斯消元
得到一个阶梯矩阵 只有最后两列没有被消元
然后每去掉一列 拿出新的矩阵 做一次消元
1 a12 a13 a14
0 1 a23 a24
0 0 1 a34
假设去掉第一列
a12 a13 a14
1 a23 a24
0 1 a34
把第一行添到到最后一行后面
1 a23 a24
0 1 a34
a12 a13 a14
再做一次消元
1 a23 a24
0 1 a34
0 0 s44
然后这一行的ans 就是 s44* 消元的系数
(注意消元时候的除法用逆元 以及去掉最后两列时直接在最初的消元好的矩阵中求解 不再做新的消元)
代码 :
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+;
int pow_mod(int n,int m)
{
int ret=;
while (m){
if (m&)ret=1LL*ret*n%mod;
n=1LL*n*n%mod;
m>>=;
}
return ret;
}
vector<int> a[];
vector<int> st[];
int ans1[];
int ans2[];
inline int up_mod(long long x)
{
return ((x%mod)+mod)%mod;
}
int main()
{
int n;
int i,j,k,l;
while (~scanf("%d",&n)){
n--;
int v;
for (i=;i<=n;i++){
a[i].clear();
a[i].push_back();
ans1[i]=ans2[i]=;
for (j=;j<=n+;j++){
scanf("%d",&v);
a[i].push_back(v);
}
}ans1[n+]=ans2[n+]=;
if (n==){
printf("%d %d\n",a[][],a[][]);
continue ;
}
int det=;
for (i=;i<=n;i++){
for (j=i;j<=n;j++){
if (a[j][i]>)break;
}
if (j==n+)continue;
if (j!=i){
swap(a[i],a[j]);
det=up_mod(-det);
}
det=up_mod(1LL*det*a[i][i]);
int inv=pow_mod(a[i][i],mod-);
for (j=i;j<=n+;j++)a[i][j]=up_mod(1LL*inv*a[i][j]);
for (j=i+;j<=n;j++){
int tmp=a[j][i];
for (k=i;k<=n+;k++){
a[j][k]=up_mod(a[j][k]-1LL*tmp*a[i][k]);
}
}
}
/* for (i=1;i<=n;i++,puts(""))for (j=1;j<=n+1;j++)printf("%12d",a[i][j]);*/
for (i=;i<=n-;i++){
int pre=;
for (j=;j<=n;j++){
if (j==i)st[n]=a[i];
else st[pre++]=a[j];
}
for (k=i+;k<=n;k++){
if (!st[n][k])continue;
int tmp=st[n][k];
for (j=k;j<=n+;j++){
st[n][j]=up_mod(st[n][j]-1LL*st[k-][j]*tmp);
}
}/*puts("");
for (j=1;j<=n;j++,puts("")){
for (k=1;k<=n+1;k++)printf("%10d",st[j][k]);
}*/
int ans=st[n][n+];
pre=;
int mm=det;
if ((n-i)&)mm=up_mod(-det);
printf(i==?"%d":" %d",up_mod(1LL*mm*ans));
}
printf(" %d %d\n",up_mod(1LL*det*a[n][n+]),det);
}
return ;
}
ac 运行时间为218ms
第二种思路是在开头加一行数 然后题目相当于求第一行每个元素对应的代数余子式
等价于求伴随矩阵
下面的代码是qls的 借来一用 思路很清晰
利用逆矩阵求伴随矩阵
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=;
const int Mod=;
int a[MAXN][MAXN],b[MAXN][MAXN];
int get_rand(int x)//[0,x)
{
int t=;
while((<<t)<x)t++;
int res=x;
while(res>=x)
{
res=;
for(int i=;i<t;i++)
res|=(rand()%)<<i;
}
return res;
}
int fp(int a,int k)
{
int res=;
while(k)
{
if(k&)res=1LL*res*a%Mod;
a=1LL*a*a%Mod;
k>>=;
}
return res;
}
void solve(int n)
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
b[i][j]=(i==j);
int det=;
for(int i=;i<=n;i++)
{
int t=i;
for(int k=i;k<=n;k++)
if(a[k][i])t=k;
if(t!=i)det*=-;
for(int j=;j<=n;j++)
{
swap(a[i][j],a[t][j]);
swap(b[i][j],b[t][j]);
}
det=1LL*a[i][i]*det%Mod;
int inv=fp(a[i][i],Mod-);
for(int j=;j<=n;j++)
{
a[i][j]=1LL*inv*a[i][j]%Mod;
b[i][j]=1LL*inv*b[i][j]%Mod;
}
for(int k=;k<=n;k++)
{
if(k==i)continue;
int tmp=a[k][i];
for(int j=;j<=n;j++)
{
a[k][j]=(a[k][j]-1LL*a[i][j]*tmp%Mod+Mod)%Mod;
b[k][j]=(b[k][j]-1LL*b[i][j]*tmp%Mod+Mod)%Mod;
}
}
}
det=(det+Mod)%Mod;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
b[i][j]=1LL*det*b[i][j]%Mod;
}
int main()
{
srand(time(NULL));
int n;
while(scanf("%d",&n)!=EOF)
{
for(int j=;j<=n;j++)
a[][j]=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]);
solve(n);
for(int i=;i<=n;i++)
printf("%d%c",(i& ? b[i][] : (Mod-b[i][])%Mod)," \n"[i==n]);
}
return ;
}
2017湘潭赛 A题 Determinant (高斯消元取模)的更多相关文章
- POJ 2065 SETI (高斯消元 取模)
题目链接 题意: 输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'*'对应0,‘a’对应1,‘b’对应2.... 例如str[] = "abc&quo ...
- NEFU 503 矩阵求解 (非01异或的高斯消元)
题目链接 中文题,高斯消元模板题. #include <iostream> #include <cstdio> #include <cmath> #include ...
- POJ 2065 SETI [高斯消元同余]
题意自己看,反正是裸题... 普通高斯消元全换成模意义下行了 模模模! #include <iostream> #include <cstdio> #include <c ...
- POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题
http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...
- 【zoj3645】高斯消元求解普通线性方程
题意: 给你一个方程组(含有12个方程),求(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11) 方程组的形式是一个二次方程组 (ai1-x1)^2 + (ai2-x2)^2 +( ...
- 题解【AcWing883】高斯消元解线性方程组
题面 高斯消元模板题. 这里直接讲述一下高斯消元的算法流程: 枚举每一列 \(c\): 找到第 \(c\) 列绝对值最大的一行: 将这一行换到最上面: 将该行的第一个数变成 \(1\): 将下面所有行 ...
- XTU 1260 - Determinant - [2017湘潭邀请赛A题(江苏省赛)][高斯消元法][快速幂和逆元]
是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了) 省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...
- HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4818 深深地补一个坑~~~ 现场赛坑在这题了,TAT.... 今天把代码改了下,过掉了,TAT 很明显 ...
- 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)
A------------------------------------------------------------------------------------ 题目链接:http://20 ...
随机推荐
- RMI,socket,rpc,hessian,http比较
SOCKET使用时可以指定协议TCP,UDP等: RIM使用JRMP协议,JRMP又是基于TCP/IP: RPC底层使用SOCKET接口,定义了一套远程调用方法: HTTP是建立在TCP上,不是使用S ...
- [COCI2015]ZGODAN
题目大意: 给你一个数$n(n\leq10^1000)$,定义一个数是“美丽数”当且仅当这个数各个数位上的数奇偶性不同. 求最接近$n$的“美丽数”,若有多个,则依次输出. 思路: 贪心+高精度. 首 ...
- 不输入用户名密码通过跳板机登录到线上linux机器
问题: 一般情况下,公司所有的服务器都在内网,公网访问.管理服务器都要先通过登录一台跳板机,然后再由跳板机登录到相应的服务器进行操作,跳板机与服务器的连接都是内网地址.我们经常看到的现象就是下图这样, ...
- 单条sql性能分析与优化
性能分析 1. explain 查看sql执行计划,得出索引使用情况等信息 2. show profiling 查看sql所有执行步骤以及用时,使用步骤如下 1)开启性能剖析 mysql> se ...
- 用gulp+webpack构建多页应用——记一次Node多页应用的构建过程
通过参考网上的一些构建方法,当然也在开发过程中进行了一番实践,最终搭建了一套适用于当前多页应用的构建方案,当然该方案还处于draft版本,会在后续的演进过程中不断的优化. 个人觉得该方案的演进过程相对 ...
- linux PHP 安装及 GD库安装
linux GD库安装 GD 安裝 第一部需要做的是先要安裝 GD 到系統內,而安裝 GD 前需要安裝 jpeg-6b, libpng, zlib, freetype.以下是下载网址:GD 2.0.3 ...
- 【spring boot】集成了druid后,同样的mybatis模糊查询语句出错Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'name LIKE '%' ? '%'
druid版本是 <!-- https://mvnrepository.com/artifact/com.alibaba/druid 数据库连接池--> <dependency> ...
- 访问php程序无法解析,排查步骤
1.安装lamp后,php程序没有被解析 (1) apachectl -M 看是否加载了libphp5.so ,apachectl -M 这个命令查看动态libphp5.so的是否由apache加载 ...
- Spring获取properties文件中的属性
1.前言 本文主要是对这两篇blog的整理,感谢作者的分享 Spring使用程序方式读取properties文件 Spring通过@Value注解注入属性的几种方式 2.配置文件 applicatio ...
- 对checkpoint not completed的理解
如果数据库存在两个日志组log1和log2,首先.-->log1-->log2-->log1,此时(log2切换到log1)触发checkpoint.该checkpoint will ...