[POJ2065]SETI(高斯消元)
2018-03-01 09:04
155 查看
题目:
我是超链接题意:
首先a…z=1..26,*=0读入p(模数且为质数),s(下标从0开始),s长度为n
那么求方程组
10x1+11x2...1n−1xn≡s1(modp)10x1+11x2...1n−1xn≡s1(modp)
20x1+21x2...2n−1xn≡s2(modp)20x1+21x2...2n−1xn≡s2(modp)
30x1+31x2...3n−1xn≡s3(modp)30x1+31x2...3n−1xn≡s3(modp)
…
n0x1+n1x2...nn−1xn≡sn(modp)n0x1+n1x2...nn−1xn≡sn(modp)
的一组合法解
没有无解或多解的情况
题解:
高斯消元求同余方程裸题就是普通的高斯消元把除法变成乘逆元
代码:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N=100; int mod,n,a ,b ,ans ;char st ; int ksm(int a,int k) { int ans=1; for (;k;k>>=1,a=a*a%mod) if (k&1) ans=ans*a%mod; return ans; } int inv(int a){return ksm(a,mod-2);} void gauss() { for (int i=1;i<=n;i++) { int num=i; for (int j=i+1;j<=n;j++) if (a[j][i]>a[num][i]) num=j; if (num!=i) { for (int j=i;j<=n;j++) swap(a[i][j],a[num][j]); swap(b[i],b[num]); } for (int j=i+1;j<=n;j++) { int t=a[j][i]*inv(a[i][i])%mod; for (int k=i;k<=n;k++) a[j][k]=(a[j][k]-t*a[i][k]%mod+mod)%mod; b[j]=(b[j]-t*b[i]%mod+mod)%mod; } } for (int i=n;i>=1;i--) { ans[i]=b[i]*inv(a[i][i])%mod; for (int j=1;j<i;j++) b[j]=(b[j]-a[j][i]*ans[i]%mod+mod)%mod; } } int main() { int T;scanf("%d",&T); while (T--) { scanf("%d",&mod); scanf("%s",st+1); n=strlen(st+1); for (int i=1;i<=n;i++) if (st[i]=='*') b[i]=0;else b[i]=st[i]-'a'+1; for (int i=1;i<=n;i++) for (int j=0;j<=n-1;j++) a[i][j+1]=ksm(i,j); gauss(); for (int i=1;i<=n;i++) printf("%d ",ans[i]); printf("\n"); } }
相关文章推荐
- [poj2065][高斯消元]SETI
- [POJ2065]SETI(高斯消元)
- POJ 2065 SETI [高斯消元同余]
- poj 2065 SETI(高斯消元)
- [高斯消元+拓展欧几里得] poj 2065 SETI
- poj 2065 SETI 高斯消元解模线性方程
- POJ 2065 SETI(高斯消元)
- UVA 1563 - SETI (高斯消元+逆元)
- poj 2065 SETI (高斯消元)
- POJ 2065 SETI 高斯消元解线性同余方程
- 【高斯消元】【poj 2065】SETI
- POJ 2065 SETI(高斯消元)
- poj 2065 SETI(数学:高斯消元)
- poj 2065 SETI(高斯消元)
- poj 2065 SETI(高斯消元)
- poj2065--SETI(高斯消元)
- SETI - POJ 2065 高斯消元
- POJ 2065 SETI(高斯消元)
- 文章标题 POJ 2065 :SETI (高斯消元)
- POJ-2065 SETI 高斯消元,扩展GCD