该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
#include
#include
#include
using namespace std;
ifstream fin("alpha.in");
ofstream fout("alpha.out");
#define cin fin
#define cout fout
int nn;
///
//LUP 解线性方程组
//by kicc
///
//index start from 1
const int N=30;
int aa[N][2*N];
int ans [N];
void printaa(){
int i,j;
for(i=0;i
for(j=0;j<2*nn;j++)cout<
cout<
}
cout<
}
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
void simple(int k){
int p=0,i;
for(i=0;i<2*nn;i++)p=gcd(p,aa[k][i]);
for(i=0;i<2*nn;i++)aa[k][i]/=p;
}
void LUP(){
int i,j,k,k1;
for(i=0;i
//printaa();
for(k=0;k
for(i=k;i
if(aa[i][k]!=0){
k1=i;
break;
}
}
assert(i!=nn);
for(i=0;i<2*nn;i++)
std::swap(aa[k][i],aa[k1][i]);
for(i=k+1;i
if(aa[i][k]==0)continue;
int b=aa[i][k];
for(j=k;j<2*nn;j++)
aa[i][j]=aa[i][j]*aa[k][k]-b*aa[k][j];
simple(i);
}
//printaa();
}
for(k=nn-1;k>=0;k--){
for(i=0;i
if(aa[i][k]==0)continue;
int b=aa[i][k];
for(j=0;j<2*nn;j++)
aa[i][j]=aa[i][j]*aa[k][k]-b*aa[k][j];
simple(i);
}
//printaa();
}
//printaa();
}
int bb[N];
int used[N];
void solveequ(){
int i,j,sum;
for(i=0;i
for(i=0;i
sum=0;
for(j=0;j
if(sum%aa[i][i]!=0)return;
int p=sum/aa[i][i];
if(p<0||p>=nn||used[p])return;
used[p]=1;
ans[i]=p;
}
for(i=0;i
cout<
if(i!=nn-1)cout<
else cout<
}
}
char equ[3][N];
void setaa(){
//printaa();
int i,j;
for(i=0;i
aa[i][equ[0][i]-'A']++;
aa[i][equ[1][i]-'A']++;
aa[i][equ[2][i]-'A']--;
}
//printaa();
}
void input(){
cin>>nn;
assert(1<=nn&&nn<=26);
cin>>equ[0]>>equ[1]>>equ[2];
assert(strlen(equ[0])==nn);
assert(strlen(equ[1])==nn);
assert(strlen(equ[2])==nn);
int i,j;
bool c[26];
for(i=0;i<26;i++)c[i]=false;
for(i=0;i<3;i++){
for(j=0;j
}
for(i=0;i
for(i=nn;i<26;i++)assert(c[i]==false);
}
void solve(){
int i,j,k;
setaa();
LUP();
int ss=1<
int b[30];
for(i=0;i
for(j=0;j
if(i&(1<
else b[j]=0;
}
b[nn-1]=0;
for(j=0;j
if(j==0)bb[nn-1-j]=nn*b[j];
else bb[nn-1-j]=nn*b[j]-b[j-1];
}
solveequ();
}
}
int main(){
input();
solve();
return 0;
}
这个是C++源码…�