【BubbleCup X】F:Product transformation
按照题解的规律,首先能看出前面每个数幂次的性质。
然后发掘约数的性质
#include<bits/stdc++.h> const int N=1000010; 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=1; for(;p;p>>=1,x=1LL*x*x%yql)if(p&1)ans=1LL*ans*x%yql; return ans; } inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9'); do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9'); return f*x; } int main(){ n=read();m=read();a=read();Q=read(); int now=1; for(int i=1;;i++){ now=1LL*now*a%Q;if(now==1){yql=i;break;} } fac[0]=1;for(int i=1;i<=m;i++)fac[i]=(1LL*fac[i-1]*i)%yql; inv[m]=fpow(fac[m],yql-2,yql); for(int i=m-1;i>=0;i--)inv[i]=1LL*inv[i+1]*(i+1)%yql; int lim=min(n,m+1); for(int i=1;i<=lim;i++)ans[n-i+1]=(ans[n-i+2]+C(m,i-1))%yql; for(int i=n-lim;i;i--)ans[i]=ans[i+1]; //for(int i=1;i<=n;i++)printf("%d ",ans[i]);puts(""); for(int i=1;i<=n;i++)printf("%d ",fpow(a,ans[i],Q)); }
zzq wc-ctsc-apio-NOI Au;yql精通多项式;zyz精通女装;由乃精通数据结构;孔老师是毒奶大师;我没有学上:我们都有光明的前途。