#include using namespace std; #include namespace mp=boost::multiprecision; class residue_ring{ public: mp::cpp_int mod;//法 mp::cpp_int value;//値 residue_ring(mp::cpp_int a,mp::cpp_int m){ mod=m; value=a%m+(a<0?m:0); } residue_ring operator * (residue_ring a){ return residue_ring(value*a.value,mod); } residue_ring operator - (residue_ring a){ return residue_ring(value-a.value,mod); } residue_ring operator + (residue_ring a){ return residue_ring(value+a.value,mod); } residue_ring operator ^ (mp::cpp_int a){ residue_ring ret(1,mod); residue_ring temp(value,mod); while(a>0){ if(a%2){ ret=ret*temp; } temp=temp*temp; a/=2; } return ret; } residue_ring operator / (residue_ring a){//modが素数の場合のみ使用可能 a=a^(mod-2); return residue_ring(value*a.value,mod); } }; int main(){ int P,N; cin>>P>>N; int temp; vector A(N); for(int i=0;i>A[i]; } string S; residue_ring ret(A[0],P); cin>>S; for(int i=0;i