[POJ2065]SETI(高斯消元)

题目描述

传送门
题意:
良心博主才会给出题意…
直接说方程是什么吧…
首先a…z=1..26,*=0
读入p(模数且为质数),s(下标从0开始),s长度为n
那么求方程组
10x1+11x2...1n1xns1(modp)
20x1+21x2...2n1xns2(modp)
30x1+31x2...3n1xns3(modp)

n0x1+n1x2...nn1xnsn(modp)
的一组合法解
没有无解或多解的情况

题解

高斯消元求同余方程裸题
就是普通的高斯消元把除法变成乘逆元

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 100

char s[N];
int T,Mod,n,K;
int a[N][N],b[N],ans[N];

void clear()
{
    Mod=n=K=0;
    memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(ans,0,sizeof(ans));
}
int fast_pow(int x,int p)
{
    int ans=1;
    for (;p;p>>=1,x=x*x%Mod)
        if (p&1)
            ans=ans*x%Mod;
    return ans;
}
int inv(int x)
{
    return fast_pow(x,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][j]) num=j;
        if (num!=i)
        {
            for (int j=1;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=1;k<=n;++k)
                a[j][k]=((a[j][k]-a[i][k]*t%Mod)%Mod+Mod)%Mod;
            b[j]=((b[j]-b[i]*t)%Mod+Mod)%Mod;
        }
    }
    for (int i=n;i>=1;--i)
    {
        for (int j=i+1;j<=n;++j)
            b[i]=((b[i]-a[i][j]*ans[j]%Mod)%Mod+Mod)%Mod;
        ans[i]=b[i]*inv(a[i][i])%Mod;
    }
}
int main()
{
    scanf("%d",&T);
    while (T--)
    {
        clear();
        scanf("%d",&Mod);
        scanf("%s",s);n=strlen(s);
        for (int i=1;i<=n;++i)
        {
            ++K;a[i][1]=1;
            for (int j=2;j<=n;++j)
                a[i][j]=a[i][j-1]*K%Mod;
            if (s[i-1]!='*') b[i]=s[i-1]-'a'+1;
        }
        gauss();
        for (int i=1;i<=n;++i) printf("%d%c",ans[i]," \n"[i==n]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值