Day 4 测试(QwQ 表示没考好 未完待续。。。 可能要过一段时间才会更

本文介绍了一种矩阵求逆的方法,特别适用于处理大模数情况。通过使用exgcd算法求逆元,并实现了矩阵的高斯消元,最终得到模数下的逆矩阵。文章包含完整的代码实现,适合于对矩阵运算和模数编程感兴趣的读者。

 

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #define LL long long
 8 using namespace std;
 9 LL mod;
10 LL a[410][410];
11 int n,is[410],js[410];
12 void exgcd(int a,int b,int &x,int &y){
13     if(!b)return x=1,y=0,void();
14     exgcd(b,a%b,y,x);y-=x*(a/b);
15 }
16 int inv(int p){
17     int x,y;exgcd(p,mod,x,y);
18     return (x+mod)%mod;
19 }
20 void inv(){
21     for(int k=1;k<=n;k++){
22         for(int i=k;i<=n;i++) 
23             for(int j=k;j<=n;j++)if(a[i][j]){
24                 is[k]=i,js[k]=j;break;
25             }
26         for(int i=1;i<=n;i++) 
27             swap(a[k][i],a[is[k]][i]);
28         for(int i=1;i<=n;i++)
29             swap(a[i][k],a[i][js[k]]);
30         if(!a[k][k]){
31             puts("No Solution");
32             exit(0);
33         }
34         a[k][k]=inv(a[k][k]); 
35         for(int j=1;j<=n;j++)if(j!=k) 
36             (a[k][j]*=a[k][k])%=mod;
37         for(int i=1;i<=n;i++)if(i!=k) 
38             for(int j=1;j<=n;j++)if(j!=k)
39                 (a[i][j]+=mod-a[i][k]*a[k][j]%mod)%=mod;
40         for(int i=1;i<=n;i++)if(i!=k) 
41             a[i][k]=(mod-a[i][k]*a[k][k]%mod)%mod;
42     }
43     for(int k=n;k;k--){ 
44         for(int i=1;i<=n;i++)
45             swap(a[js[k]][i],a[k][i]);
46         for(int i=1;i<=n;i++)
47             swap(a[i][is[k]],a[i][k]);
48     }
49 }
50 int main(){
51     //freopen("a.in","r",stdin);
52     //freopen("a.out","w",stdout);
53     scanf("%d%d",&n,&mod);
54     for(int i=1;i<=n;i++)
55         for(int j=1;j<=n;j++)
56             scanf("%lld",a[i]+j);
57     inv();
58     for(int i=1;i<=n;i++)
59         for(int j=1;j<=n;j++)
60             printf("%lld%c",a[i][j],j==n?'\n':' ');
61     return 0;
62 }

第一题板子题,就是把模数1e9+7改成了输入的数

 

 zhx大佬:这道题如果你没有做过矩阵求逆的话是最简单的(虽然我连样例都差点没看懂

 

转载于:https://www.cnblogs.com/lcezych/p/10686247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值