#include<bits/stdc++.h> usingnamespace std; #define int long long inlineintread(){int x=0,f=1;char ch=getchar(); while(ch<'0'|| ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;} #define Z(x) (x)*(x) #define pb push_back //mt19937 rand(time(0)); //mt19937_64 rand(time(0)); //srand(time(0)); #define N 40000010 //#define M #define mo 1051131 intpw(int a, int b){ int ans=1; while(b) { if(b&1) ans*=a; a*=a; b>>=1; ans%=mo; a%=mo; } return ans; } constint iv2=525566; int n, m, i, j, k, T; int ans, s, t, a[N];
voidsolve(int k, int p, int q){ //计算k,则应由k-1转移过来 // printf("[%lld] %lld %lld\n", k, p, q); if(!k) return a[0]=a[0]*pw(p+q, t)%mo, void(); //B0=1=I, so A=(A*B0')^t=(A*B0^(p+q))^t int tw=(1ll<<k-1), i, x, y, G=pw(-(1ll<<k-1)*p+p+q, t)%mo; // printf(">> %lld %lld\n", tw, G); for(i=0; i<(1<<k-1); ++i) { x=a[i]; y=a[i+tw]; a[i]=(x+y)%mo; //低位拿下去分治 a[i+tw]=(x-y)*G%mo; //(a1-a2)*(-2^k*p+p+q) } solve(k-1, 2*p%mo, ((1ll<<k-1)*p-p+q)%mo); for(i=0; i<(1<<k-1); ++i) { x=a[i]; y=a[i+tw]; a[i]=(x+y)*iv2%mo; //代公式 a[i+tw]=(x-y)*iv2%mo; } }