難しく考えすぎたようです
確かに余りだけを扱うなら、多倍長整数にこだわる必要はなかったですね

>>389は以下でよいのではないでしょうか
>>390でも同じ内容とは思いますが

#include <iostream>
using namespace std;

unsigned int h[200];

unsigned int mod(char *x){
unsigned int sum=0,n;
for(n=0;x[n]>=0;n++) sum+=h[n]*x[n];
return sum;}

main(){
unsigned int m, n, k=1;
//初期化
for(n=0;n<200;n++){ h[n]=k; k=k*3; }

char san[]={0,0,1,1,1,1,1,1,2,2,1,2,1,0,2,2,1,0,2,1,0,1,-1};
cout<<mod(san);
}