按照题解的规律,首先能看出前面每个数幂次的性质。
然后发掘约数的性质
#include<bits/stdc++.h>
const int N=;
typedef long long ll;
using namespace std;
int n,m,a,Q,yql,ans[N],fac[N],inv[N];
inline int C(int n,int k){
return 1LL*fac[n]*inv[k]%yql*inv[n-k]%yql;
}
inline int fpow(int x,int p,int yql){
int ans=;
for(;p;p>>=,x=1LL*x*x%yql)if(p&)ans=1LL*ans*x%yql;
return ans;
}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();a=read();Q=read();
int now=;
for(int i=;;i++){
now=1LL*now*a%Q;if(now==){yql=i;break;}
}
fac[]=;for(int i=;i<=m;i++)fac[i]=(1LL*fac[i-]*i)%yql;
inv[m]=fpow(fac[m],yql-,yql);
for(int i=m-;i>=;i--)inv[i]=1LL*inv[i+]*(i+)%yql;
int lim=min(n,m+);
for(int i=;i<=lim;i++)ans[n-i+]=(ans[n-i+]+C(m,i-))%yql;
for(int i=n-lim;i;i--)ans[i]=ans[i+];
//for(int i=1;i<=n;i++)printf("%d ",ans[i]);puts("");
for(int i=;i<=n;i++)printf("%d ",fpow(a,ans[i],Q));
}