#include #include using namespace std; using ll=long long; #define rep(i,n) for(int i=0;i<(n);++i) vector> make_mat(vector v){ if(v.empty())return vector>(1,vector()); long long n=v.back(); v.pop_back(); vector> ret; vector> tmp=make_mat(v); for(auto e:tmp)for(long long i=0;i 1) ret -= ret / n; return ret; } int main(){ ll m,d,n,b; cin>>m>>d>>n>>b; vectorphi=vector{b}; while(phi.back()!=1){ phi.emplace_back(euler_phi(phi.back())); } auto mul=[&](vectorv){ vectorres(phi.size()); rep(i,phi.size()-1){ if(v[i]<=phi[i]||v[i+1]<=phi[i+1]){ ll tmp=1; bool over=0; rep(j,v[i+1]){ tmp*=v[i]+d; if(tmp>=phi[i]){ over=1; } } res[i]=phi[i]*over+tmp%phi[i]; }else{ res[i]=atcoder::pow_mod(v[i]+d-phi[i],v[i+1]-phi[i+1],phi[i])+phi[i]; } } return res; }; auto tb=phi; rep(i,phi.size())tb[i]*=2; map,vector>ma; for(auto v:make_mat(tb)){ ma[v]=mul(v); } vectorv(phi.size()); rep(i,phi.size())v[i]=m%phi[i]+(m>=phi[i]?phi[i]:0); auto ans=v; // cerr<,vector>ma2; for(auto [s,t]:ma){ ma2[s]=mul(t); } n/=2; swap(ma,ma2); } if(ans[0]%b==10)cout<<"A"<