跟poj2945基本一模一样,只不过是模的值是题目中给定的
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=100;
char s[maxn];
int p,MOD;
int equ,var;
int a[maxn][maxn],x[maxn];
bool free_x[maxn];
int encode(char x)
{
if(x=='*')return 0;
return x-'a'+1;
}
int gcd(int x,int y)
{
if(!y)return x;
return gcd(y,x%y);
}
int lcm(int x,int y)
{
return x*y/gcd(x,y);
}
int Gauss()
{
int row=0,col=0;
int free_num=0;
int LCM,ta,tb;
int free_index,temp;
for(int i=0;i<=var;i++)free_x[i]=true;
for(;row<equ&&col<var;row++,col++)
{
int r=row;
for(int i=row+1;i<equ;i++)
if(abs(a[i][col])>abs(a[r][col]))r=i;
if(row!=r)
for(int i=row;i<=var;i++)swap(a[r][i],a[row][i]);
if(!a[row][col])
{
row--;
continue;
}
for(int i=row+1;i<equ;i++)
{
if(a[i][col]!=0)
{
LCM=lcm(abs(a[i][col]),abs(a[row][col]));
ta=LCM/abs(a[i][col]);
tb=LCM/abs(a[row][col]);
if(a[i][col]*a[row][col]<0)tb=-tb;
for(int j=col;j<=var;j++)
a[i][j]=((a[i][j]*ta-a[row][j]*tb)%MOD+MOD)%MOD;
}
}
}
for(int i=row;i<equ;i++)
if(a[i][col]!=0)return -1;
if(row<var)
{
for(int i=row-1;i>=0;i--)
{
free_num=0;
for(int j=0;j<var;j++)
if(a[i][j]!=0&&free_x[j])free_num++,free_index=j;
if(free_num>1)continue;
temp=a[i][var];
for(int j=0;j<var;j++)
{
if(a[i][j]!=0&&j!=free_index)temp-=a[i][j]*x[j]%MOD;
temp=(temp%MOD+MOD)%MOD;
}
x[free_index]=(temp/a[i][free_index])%MOD;
free_x[free_index]=0;
}
return var-row;
}
for(int i=var-1;i>=0;i--)
{
temp=a[i][var];
for(int j=i+1;j<var;j++)
{
if(a[i][j]!=0)temp-=a[i][j]*x[j];
temp=(temp%MOD+MOD)%MOD;
}
while(temp%a[i][i]!=0)temp+=MOD;
x[i]=(temp/a[i][i])%MOD;
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%s",&p,s);
equ=var=strlen(s);
memset(a,0,sizeof(a));
for(int i=0;i<var;i++)
{
a[i][0]=1;
for(int j=1;j<var;j++)
a[i][j]=(a[i][j-1]*(i+1))%p;
}
MOD=p;
for(int i=0;i<var;i++)
a[i][var]=encode(s[i])%MOD;
int cnt=Gauss();
bool flag=true;
for(int i=0;i<var;i++)
{
if(flag)flag=false;
else printf(" ");
printf("%d",x[i]);
}
printf("\n");
}
return 0;
}