链接

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 (高斯消元取模)的更多相关文章

  1. POJ 2065 SETI (高斯消元 取模)

    题目链接 题意: 输入一个素数p和一个字符串s(只包含小写字母和‘*’),字符串中每个字符对应一个数字,'*'对应0,‘a’对应1,‘b’对应2.... 例如str[] = "abc&quo ...

  2. NEFU 503 矩阵求解 (非01异或的高斯消元)

    题目链接 中文题,高斯消元模板题. #include <iostream> #include <cstdio> #include <cmath> #include ...

  3. POJ 2065 SETI [高斯消元同余]

    题意自己看,反正是裸题... 普通高斯消元全换成模意义下行了 模模模! #include <iostream> #include <cstdio> #include <c ...

  4. 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:// ...

  5. 【zoj3645】高斯消元求解普通线性方程

    题意: 给你一个方程组(含有12个方程),求(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11) 方程组的形式是一个二次方程组 (ai1-x1)^2 + (ai2-x2)^2 +( ...

  6. 题解【AcWing883】高斯消元解线性方程组

    题面 高斯消元模板题. 这里直接讲述一下高斯消元的算法流程: 枚举每一列 \(c\): 找到第 \(c\) 列绝对值最大的一行: 将这一行换到最上面: 将该行的第一个数变成 \(1\): 将下面所有行 ...

  7. XTU 1260 - Determinant - [2017湘潭邀请赛A题(江苏省赛)][高斯消元法][快速幂和逆元]

    是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了) 省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...

  8. HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4818 深深地补一个坑~~~ 现场赛坑在这题了,TAT.... 今天把代码改了下,过掉了,TAT 很明显 ...

  9. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

随机推荐

  1. Closest Binary Search Tree Value -- LeetCode

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  2. Codeforces 757 E Bash Plays with Functions

    Discription Bash got tired on his journey to become the greatest Pokemon master. So he decides to ta ...

  3. iOS import framework头文件时报错could not build module xxx

    导致这个错误的原因有多种: 1.库的search paths没有设置对. 2.库里面某些头文件找不到. 而导致.h头文件找不到的原因也有多种: (a)search paths没设置对,文件可能换过位置 ...

  4. oracle 博客精选

    http://mp.sohu.com/profile?xpt=b3JhbmV3c0Bzb2h1LmNvbQ==

  5. 一张图解释RxJava中的线程控制

    如果调用链中包含多个subscribeOn和observeOn,会是什么情况? 这实际上是一个至关重要的问题,因为在任何情况下,我们都应该弄清楚我们写的每一行代码到底是运行在哪个线程上.这个问题绝对不 ...

  6. vs2012 webservice创建

    第一步:打开VS2012,新建空项目,注意选择.NET Framework的版本.这里我选择的是.NET Framework 4 新建好项目后,在项目中添加一个WebService项 打开这个文件,我 ...

  7. python 验证码识别之pytesser以及image学习记录

    一般的步骤就是上面这些,总的来说分为三部分,去除背景,分割字符,识别. 去除背景可以通过灰度化,二值化,去噪,倾斜度校正等(一般来说灰度化和二值化都是需要的,去噪和倾斜度看情况) 安装PIL工具,下载 ...

  8. 深入理解ES6里的promise

    一.ES6 Promise是什么? 复杂的概念先不讲,我们先简单粗暴地把Promise用一下,有个直观感受.那么第一个问题来了,Promise是什么呢?是一个类?对象?数组?函数? 别猜了,直接打印出 ...

  9. [转载]CentOS 6.5 安装五笔输入法

    FROM:http://blog.sina.com.cn/s/blog_49d6d41c0101i0zs.html 1.一般安装了中文环境会默认安装了好多输入法,先删除了ibus  sudo yum ...

  10. 如何在阿里云服务器搭建FTP服务器,在本地电脑连接并操作

    首先你需要有一个阿里云的ECS服务器 并且开通了公网宽带(话说也不贵,开来玩玩还是可以的,第一次买会比较便宜,第二次买1M的宽带两天是九毛多吧~) 开通了宽带之后,ECS服务器就可以上网了 如果嫌弃阿 ...