题解
可以证明该三元组满***换律和结合律,同时单位元为(1,0,0),满足快速幂,但是幂次可以达到存不下,使用JAVA或者PYTHON大数也显然会T,然后选择将幂次对
进行取模(别问我为什么,我也不知道),然后就好做了。
###代码
#include <bits/stdc++.h> using namespace std; #define paii pair<int,int> #define fr first #define sc second typedef long long ll; const int N=2e5+5; const int p=998244353; ll e[25][N]; __int128 pre[405]; __int128 mo=1ll*p*p-1; struct node { ll x,y,z; node operator *(const node &a)const{ return {(x*a.x+y*a.z+z*a.y)%p,(y*a.x+z*a.z+x*a.y)%p,(z*a.x+x*a.z+y*a.y)%p}; } }v[N]; node qpow(node a,ll n) { node res; res.x=1; res.y=0; res.z=0; while(n){ if(n&1)res=res*a; a=a*a; n>>=1; } return res; } void work() { pre[0]=1; for(int i=1;i<=400;i++){ pre[i]=pre[i-1]*2%mo; } int n,m,q,z0,a,b; scanf("%d%d%d%d%d%d",&n,&m,&q,&z0,&a,&b); ll z=z0; for(int i=1;i<=n;i++){ z=(z*a+b)%pre[32]; v[i].x=z%p; z=(z*a+b)%pre[32]; v[i].y=z%p; z=(z*a+b)%pre[32]; v[i].z=z%p; } for(int k=1;k<=q;k++){ for(int i=1;i<=n;i++){ e[k][i]=0; for(int j=0;j<m;j++){ z=(z*a+b)%pre[32]; __int128 tmp=z; tmp=tmp*pre[32*j]%mo; e[k][i]=(e[k][i]+tmp)%mo; } } } for(int i=1;i<=q;i++){ node res; res.x=1; res.y=0; res.z=0; for(int j=1;j<=n;j++){ res=res*qpow(v[j],e[i][j]); } printf("%lld %lld %lld\n",res.x,res.y,res.z); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T=1; //scanf("%d",&T); //cin>>T; while(T--){ work(); } }