题解
可以证明该三元组满***换律和结合律,同时单位元为(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();
}
} 
京公网安备 11010502036488号