XTU 1260 - Determinant

是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了)

省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到伴随矩阵从而得到答案,emmmmm真是非常通俗易懂呢!

于是在回学校的路上强行回忆上学期学的线性代数,把这题题解的原理想通了,然后到现在把高斯消元法补了,才把这题做出来……

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define MAXN 205
 4 #define MOD 1000000007
 5 typedef long long ll;
 6 using namespace std;
 7 int n;
 8 ll a[MAXN][2*MAXN],det;//注意矩阵的列数要是MAXN的两倍,因为( A , E ) -> ( E , inv(A) )
 9 ll pow(ll a,ll b){//快速幂
10     ll r=1,base=a%MOD;
11     while(b){
12         if(b&1) r*=base , r%=MOD;
13         base*=base;
14         base%=MOD;
15         b>>=1;
16     }
17     return r;
18 }
19 ll inv_(ll a){return pow(a,MOD-2);}//求逆元
20 void debug()
21 {
22     for(int i=1;i<=n;i++)
23     {
24         for(int j=1;j<=2*n;j++) printf("%I64d ",a[i][j]);
25         printf("\n");
26     }
27 }
28 int Gauss_eli(int row,int col)
29 {
30     det=1;
31     for(int i=1;i<=row;i++)//a[i][i]
32     {
33         int tmp;
34         for(int ii=i;ii<=n;ii++) if(a[ii][i]) tmp=ii;
35         if(tmp!=i) det*=-1;//行列式交换两行要取负
36         for(int j=1;j<=col;j++) swap(a[tmp][j],a[i][j]);//交换两行
37         det=(det*a[i][i]%MOD + MOD)%MOD;
38         ll inv=inv_(a[i][i]);//求得逆元
39         for(int j=1;j<=col;j++) a[i][j]=a[i][j]*inv%MOD;
40         for(int r=1;r<=row;r++)
41         {
42             if(r==i) continue;
43             ll mult=a[r][i];
44             for(int c=1;c<=col;c++) a[r][c]=(a[r][c] - a[i][c]*mult%MOD + MOD)%MOD;//消元
45         }
46         //debug(); printf("det = %I64d\n",det);
47     }
48 }
49 int main()
50 {
51     //freopen("input.txt","r",stdin);
52     //freopen("output1.txt","w",stdout);
53     while(scanf("%d",&n)!=EOF)
54     {
55         for(int j=1;j<=n;j++) a[1][j]=1;
56         for(int i=2;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lld",&a[i][j]);
57         for(int i=1;i<=n;i++) for(int j=n+1;j<=2*n;j++) a[i][j]=(i==(j-n));
58         Gauss_eli(n,2*n);
59         for(int i=1;i<=n;i++)
60         {
61             if(i!=1) printf(" ");
62             if(i%2==0) a[i][n+1]=(MOD - a[i][n+1])%MOD;
63             printf("%I64d",(a[i][n+1]*det + MOD)%MOD);
64         }
65         printf("\n");
66     }
67 }

可以说是学到了,对高斯消元、逆元、取模等一系列问题有了更深的认识吧。

另附一个数据生成器,以后应该经常用得到……

 1 #include<cstdio>
 2 #include <cstdlib>
 3 #include <ctime>
 4 int get_rand(int m,int n)//[m,n]
 5 {
 6     return( rand()%(n - m + 1) + m );
 7 }
 8 int main()
 9 {
10     freopen("input.txt","w",stdout);
11     srand(time(NULL));
12     int n=get_rand(1,200);
13     printf("%d\n",n);
14     for(int i=1;i<n;i++)
15     {
16         for(int j=1;j<=n;j++) printf("%d ",get_rand(0,1000000009));
17         printf("\n");
18     }
19 }

时间: 2024-10-18 20:00:04

XTU 1260 - Determinant的相关文章

Armadillo之计算矩阵的行列式(determinant)

计算矩阵的行列式很简单,用det方法或是log_det方法 1 det(A) 如果A不是方阵的(square),将抛出std::logic_error异常 例: mat m = "3,2,4;1,-2,3;2,3,2;"; double d = det(m); cout << d << endl; 运行结果是-3 2 log_det(value, sign,A) 文档里推荐当矩阵A比较大时,使用本函数来代替det函数(估计会加快计算速度) det(A)=exp(

BZOJ 1260 [CQOI2007]涂色paint(区间DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1260 [题目大意] 假设你有一条长度为n的木版,初始时没有涂过任何颜色 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色 求最少的涂色次数达到目标状态 [题解] dp[i][j]表示涂抹i到j的最优答案, 显然当i和j相同时,可以从i+1……j,i……j-1,i+1……j-1转移过来, 同时也可以从两个区间组合得到. [代码] #include <cstdio>

[2016-03-27][HDU][1260][Tickets]

时间:2016-03-27 22:37:37 星期日 题目编号:[2016-03-27][HDU][1260][Tickets] 遇到的问题:分钟数字,除以60以后还要模60 t / 60 % 60 #include <cstdio> #include <algorithm> using namespace std; typedef long long LL; const int maxk = 2000 + 10; int s[maxk],d[maxk]; int dp[maxk]

xtu summer individual 6 B - Number Busters

Number Busters Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ID: 382B64-bit integer IO format: %I64d      Java class name: (Any) Arthur and Alexander are number busters. Today they've got a competition.

xtu DP Training C.炮兵阵地

炮兵阵地 Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 118564-bit integer IO format: %lld      Java class name: Main 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表

xtu summer individual 1 E - Palindromic Numbers

E - Palindromic Numbers Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Description A palindromic number or numeral palindrome is a 'symmetrical' number like 16461 that remains the same when its digits are reversed. In this

[ACM] hdu 1260 Tickets (动态规划)

Tickets Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 4   Accepted Submission(s) : 2 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Jesus, what a great movie! Thou

BZOJ 1260: [CQOI2007]涂色paint( 区间dp )

区间dp.. dp( l , r ) 表示让 [ l , r ] 这个区间都变成目标颜色的最少涂色次数. 考虑转移 : l == r 则 dp( l , r ) = 1 ( 显然 ) s[ l ] == s[ l + 1 ] 则 dp( l , r ) = dp( l + 1 , r )     s[ r ] == s[ r - 1 ] 则 dp( l , r ) = dp( l , r - 1 )  因为只要在涂色时多涂一格就行了, 显然相等 , 所以转移一下之后更好做 s[ l ] == s

bzoj 2107: Spoj2832 Find The Determinant III 辗转相除法

2107: Spoj2832 Find The Determinant III Time Limit: 1 Sec  Memory Limit: 259 MBSubmit: 154  Solved: 46[Submit][Status][Discuss] Description Problem code: DETER3 Given a NxN matrix A, find the Determinant of A % P. 给出一个尺寸为N×N的整数方阵A(N≤200),要求求出|A|%P的值(