#include using namespace std; #include using namespace atcoder; using ll = long long; using ld = long double; #define fi first #define se second #define pb push_back const int MAX=510000; ll MOD; ll fac[MAX],finv[MAX],inv[MAX]; void COMinit(){ fac[0]=fac[1]=1; finv[0]=finv[1]=1; inv[1]=1; for(int i=2;i>n>>p; int copyp=p; MOD=p; COMinit(); vector v; while(n>0){ v.pb(n%p); n/=p; } if(p==2){ ll ans=1; for(int i:v){ if(i==1){ ans*=2; ans%=mod; } } cout< divisor; p--; for(int i=2;i*i<=p;i++){ if(p%i==0){ divisor.pb(i); while(p%i==0){ p/=i; } } } if(p>1){ divisor.pb(p); } p=copyp; int root; while(true){ int check=ggr(2,p); int flag=1; for(int i:divisor){ if(pow_mod(check,(p-1)/i,p)==1){ flag=0; break; } } if(flag==1){ root=check; break; } if(p==2){ root=1; break; } } vector powmod(p),invpowmod(p); //powmod[i] := root^i (mod p) //invpowmod[i] := root^(invpowmod[i]) = i (mod p) powmod[0]=1; for(int i=1;i a(p,0); a[0]=1; for(int now:v){ vector b(p,0); for(int i=0;i<=now;i++){ int next=COM(now,i); if(next==0){ continue; } b[invpowmod[next]]++; } vector c=convolution(a,b); for(int i=0;i