POJ 2065 SETI 高斯消元

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove

依旧高斯消元,重要的是列方程

a0*1^0 + a1*1^1+a2*1^2+........+an-1*1^(n-1) = f(1)
a0*2^0 + a1*2^1+a2*2^2+........+an-1*2^(n-1) = f(2)
..............
a0*n^0 + a1*n^1+a2*n^2+........+an-1*n^(n-1) = f(n)

/*
ID:cxlove
PROB:poj 2065
DATA:2012.3.31
HINT:高斯消元
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int p,n,a[100][100];
char str[100];
void debug(){
	for(int i=0;i<n;i++){
		for(int j=0;j<=n;j++)
			printf("%d ",a[i][j]);
		printf("\n");
	}
}
void gauss(){
	int ans[100];
	int i,j;
	for(i=0,j=0;i<n&&j<n;j++){
		int k=i;
		for(;k<n;k++)
			if(a[k][j])
				break;
		if(a[k][j]){
			for(int r=0;r<=n;r++)
				swap(a[i][r],a[k][r]);
			for(int k=0;k<n;k++){
				if(k!=i&&a[k][j]){
					int b1=a[k][j],b2=a[i][j];
					for(int r=0;r<=n;r++)
						a[k][r]=((a[k][r]*b2-a[i][r]*b1)%p+p)%p;
				}
			}
		    i++;
		}
	}
//	debug();
	for(int i=n-1;i>=0;i--){
		int temp=a[i][n];
		for(int j=i+1;j<n;j++)
			temp=((temp-a[i][j]*ans[j])%p+p)%p;
		while(temp%a[i][i]!=0) temp+=p;
		ans[i]=(temp/a[i][i])%p;
	}
	for(int i=0;i<n-1;i++)
		printf("%d ",ans[i]);
	printf("%d\n",ans[n-1]);
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d%s",&p,str);
		n=strlen(str);
		for(int i=0;i<n;i++){
			if(str[i]=='*')
				a[i][n]=0;
			else
				a[i][n]=str[i]-'a'+1;
			a[i][0]=1;
			for(int j=1;j<n;j++)
				a[i][j]=(a[i][j-1]*(i+1))%p;
		}
	//	debug();
		gauss();
	}
	return 0;
}



你可能感兴趣的:(ini)