首页 > 其他分享 >环境

环境

时间:2022-11-19 17:55:22浏览次数:33  
标签:__ const int 环境 poly return mod

我觉得我该把这玩意发出来以便在 cnblogs 抽风时能看到

header.cpp

#include <bits/stdc++.h>
using namespace std; using pii = pair<int,int>; using vi = vector<int>; using ll = long long; 
using ull = unsigned long long; using db = double; using ld = long double; using lll = __int128_t;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
template <typename T> T rand(T l, T r) { return uniform_int_distribution<T>(l, r)(rnd); }
template <typename T> void get(T & x) {
	x = 0; char ch = getchar(); bool f = false; while (ch < '0' or ch > '9') f = f or ch == '-', ch = getchar();
	while ('0' <= ch and ch <= '9') x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); f && (x = -x); 
} template <typename T, typename ... Args> void get(T & a, Args & ... b) { get(a); get(b...); }
#define iot ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
template <typename T1, typename T2> T1 min(T1 a, T2 b) { return a < b ? a : b; }
template <typename T1, typename T2> T1 max(T1 a, T2 b) { return a > b ? a : b; }
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define ufile(x) 
#define rep(i,s,t) for (register int i = (s), i##_ = (t) + 1; i < i##_; ++ i)
#define pre(i,s,t) for (register int i = (s), i##_ = (t) - 1; i > i##_; -- i)
#define Aster(i, s) for (int i = head[s], v; i; i = e[i].next)
#define all(s) s.begin(), s.end()
#define eb emplace_back
#define pb pop_back
#define em emplace
const int N = 2e5 + 100;
const int inf = 0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fll;

// int mod;
// int fac[N], inv[N], ifac[N];
// const int mod = ;
const int mod = 998244353; // const int g = 3;
// const int mod = 1e9 + 7;
// const int mod = 1e9 + 9;
// const int mod = 1e9 + 3579, bse = 131;
/* add / sub */ 			template <typename T1, typename T2> T1 add(T1 a, T2 b) { return (a += b) >= mod ? a - mod : a; } template <typename T1, typename ...Args> T1 add(T1 a, Args ... b) { return add(a, add(b...)); } template <typename T1, typename T2> T1 sub(T1 a, T2 b) { return (a -= b) < 0 ? a + mod : a; } template <typename T1, typename ...Args> T1 sub(T1 a, Args ... b) { return add(a, add(b...)); } template <typename T1, typename T2> void addi(T1 & a, T2 b) { (a += b) >= mod ? (a -= mod) : true; } template <typename T1, typename ...Args> void addi(T1 & a, Args ...b) { addi(a, add(b...)); } template <typename T1, typename T2> void subi(T1 & a, T2 b) { (a -= b) < 0 ? (a += mod) : true; } template <typename T1, typename ...Args> void subi(T1 & a, Args ...b) { subi(a, add(b...)); }
/* Fastmod / mul */ 		struct FastMod { int m; ll b; void init(int _m) { m = _m; if (m == 0) m = 1; b = ((lll)1<<64) / m; } FastMod(int _m) { init(_m); } int operator() (ll a) {ll q = ((lll)a * b) >> 64; a -= q * m; if (a >= m) a -= m; return a; } } Mod(mod); int mul(int a, int b) { return Mod(1ll * a * b); } template <typename T1, typename T2> int mul(T1 a, T2 b) { return Mod((long long)(1ll * a * b)); } template <typename T, typename ...Args> int mul(T a, Args ...b) { return mul(a, mul(b...)); }  template <typename T1, typename T2> void muli(T1 & a, T2 b) { a = Mod(1ll * a * b); } template <typename T1, typename ...Args> void muli(T1 & a, Args ...b) { muli(a, mul(b ...)); } // /* trivial multiple function(idk whether its useful*/ int mul(int a, int b) { return 1ll * a * b % mod; } template <typename T1, typename T2> int mul(T1 a, T2 b) { return (long long)(1ll * a * b) % mod; } template <typename T, typename ...Args> int mul(T a, Args ...b) { return mul(a, mul(b...)); }
/* qp init C */ 			template <typename T1, typename T2> T1 qp(T1 a, T2 b) { T1 ret = 1; for (; b > 0; a = mul(a, a), b >>= 1) if (b & 1) ret = mul(ret, a); return ret; } template<typename T1> void init_fac(T1 bnd) { static int __var_bound; if (__var_bound == 0) fac[0] = inv[0] = ifac[0] = fac[1] = inv[1] = ifac[1] = __var_bound = 1; rep(i, __var_bound + 1, bnd) fac[i] = mul(fac[i - 1], i), inv[i] = mul(mod - mod / i, inv[mod % i]);rep(i, __var_bound + 1, bnd) ifac[i] = mul(ifac[i - 1], inv[i]); __var_bound = bnd; } template<typename T1, typename T2> int C(T1 n, T2 m) { if (n < m or m == 0) return 1; init_fac(max(n, m)); return mul(fac[n], ifac[m], ifac[n - m]); }
/* inv 2/3/6 / phi */ 		constexpr int __var_pow(int a, int b) { int ret = 1; for (; b > 0; b >>= 1, a = 1ll * a * a % mod) if (b & 1) ret = 1ll * ret * a % mod; return ret; } constexpr int __var_phi(int x) { if (x <= 2) return 1; int ret = x; for (int i = 2; 1ll * i * i <= x; ++i)  if (x % i == 0) { ret = ret / i * (i - 1); while (x % i == 0) x /= i; } if (x > 1) ret = ret / x * (x - 1); return ret; } const int __phi_mod = __var_phi(mod); const int inv2 = __var_pow(2, __phi_mod - 1), inv3 = __var_pow(3, __phi_mod - 1), inv6 = __var_pow(6, __phi_mod - 1); constexpr int __var_check() { assert( 1ll * 2 * inv2 % mod == 1 ); assert( 1ll * 3 * inv3 % mod == 1 ); assert( 1ll * 6 * inv6 % mod == 1 ); return (unsigned int)(-1); } const int __var_dummy = __var_check();



signed main() {
	file();
}



cr.cpp

/*

g++ std.cpp -o std -Wall -Wextra -Wshadow -fsanitize=undefined,address,leak

*/
#include <bits/stdc++.h>
#include<chrono>
using namespace std;
using namespace std::chrono;
void col(int id) { printf("\033[3%dm", id); }
string stat;
char ch;
signed main() {
    int __LIMIT__ = 1000, __CNT__ = 0, __AC__ = 0, __WA__ = 0;
    putchar(10);
    
    system("g++ bf.cpp -o bf -std=c++14 -Ofast");
    system("g++ std.cpp -o std -std=c++14 -O2 -fsanitize=undefined,address,leak");
    system("g++ da.cpp -o da -std=c++14 -Ofast");

    for (int i = 1; i < __LIMIT__; i++) {
        col(9), printf("#No:%4d | ", i);
        system("./da > a.in");
        auto beg = steady_clock::now();
        system("./std < a.in > as.out");
        auto ed = steady_clock::now();
        system("./bf < a.in > ab.out");
        if (system("diff ab.out as.out -q -B -w")) {
            col(1), printf("Wrong Answer"), col(9);
            __LIMIT__ *= 0.65;
            __WA__++;
        }
        else {
            col(2), printf("Accepted"), col(9);
            __CNT__++;
            if (__CNT__ == 10) __CNT__ = 0, __LIMIT__ ++;
            __AC__++;
        } 
        auto gap = duration_cast< duration<double,ratio<1,1000> > > (ed-beg);
        printf(" | %.4lf\n", gap.count());
    } col(9);
    printf("SUM : %d | AC : %d | WA : %d\nAccepting Rate : %lf\n", __AC__ + __WA__, __AC__, __WA__, 1.0 * __AC__ / (__AC__ + __WA__));
    
/*
    system("g++ std.cpp -o std -std=c++14 -fsanitize=undefined,address,leak");
    system("g++ da.cpp -o da -std=c++14 -Ofast");
    system("g++ checker.cpp -o checker -std=c++14 -O2");
    for (int i = 1; i < __LIMIT__; i++) {
        col(9), printf("#No:%4d | ", i);
        system("./da > a.in");
        long long beg = time();
        system("./std < a.in > as.out");
        long long ed = time();
        system("./checker > stat.out");
        freopen("stat.out", "r", stdin);
        cin >> stat;
        if (stat == "OK") {
            col(2), printf("Accepted"), col(9);
            __CNT__++;
            if (__CNT__ == 10) __CNT__ = 0, __LIMIT__ ++;
            __AC__++;
        } else {
            col(1), cout << stat, col(9);
            __LIMIT__ *= 0.65;
            __WA__++;

        } printf(" | %.4lf\n", 1. * (ed - beg) / CLOCKS_PER_SEC);
        fclose(stdin);
    } col(9);
    printf("SUM : %d | AC : %d | WA : %d\nAccepting Rate : %lf\n", __AC__ + __WA__, __AC__, __WA__, 1.0 * __AC__ / (__AC__ + __WA__));
*/
    putchar(10);
}



gen.cpp

#include <bits/stdc++.h>
// namespace Fread  { const int SIZE = (1 << 18); char buf[SIZE], *p1 = buf, *p2 = buf; inline char getchar() {return (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, SIZE, stdin), p1 == p2) ? EOF : *p1++);} }
// namespace Fwrite { const int SIZE = (1 << 18); char buf[SIZE], *S = buf, *T = buf+SIZE; inline void flush(){ fwrite(buf, 1, S-buf, stdout), S = buf; }  struct NTR{ ~NTR() { flush(); } }ztr;inline void putchar(char c){ *S++ = c; if(S == T) flush(); } }
// #ifdef ONLINE_JUDGE
//     #define getchar Fread::getchar
//     #define putchar Fwrite::putchar
// #endif
// namespace Fastio{
//     struct Reader{ template <typename T> Reader & operator >> (T & x) {char c = getchar(); bool f = false;while (c < '0' or c > '9') { if (c == '-') f = true;c = getchar();} x = 0;while(c >= '0' and c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} if (f) x = -x;return *this;}Reader&operator>>(char&c){ c=getchar();while(c=='\n'||c==' '||c=='\r')c=getchar();return *this;}Reader&operator>>(char*str){ int len=0;char c=getchar(); while(c=='\n'||c==' '||c=='\r')c=getchar(); while(c!='\n'&&c!=' '&&c!='\r')str[len++]=c,c=getchar(); str[len]='\0'; return *this;}Reader & operator >> (float & x) {char c=getchar();short f=1,s=0;x=0;double t=0;while((c<'0'||c>'9')&&c!='.'){if(c=='-')f*=-1;c=getchar();}while(c>='0'&&c<='9'&&c!='.')x=x*10+(c^48),c=getchar();if(c=='.')c=getchar();else return x*=f,*this;while(c>='0'&&c<='9')t=t*10+(c^48),s++,c=getchar();while(s--)t/=10.0;x=(x+t)*f;return*this;}Reader & operator >> (double & x) {char c=getchar();short f=1,s=0;x=0;double t=0;while((c<'0'||c>'9')&&c!='.'){if(c=='-')f*=-1;c=getchar();}while(c>='0'&&c<='9'&&c!='.')x=x*10+(c^48),c=getchar();if(c=='.')c=getchar();else return x*=f,*this;while(c>='0'&&c<='9')t=t*10+(c^48),s++,c=getchar();while(s--)t/=10.0;x=(x+t)*f;return*this;}Reader&operator>>(long double&x){char c=getchar();short f=1,s=0;x=0;long double t=0;while((c<'0'||c>'9')&&c!='.'){if(c=='-')f*=-1;c=getchar();}while(c>='0'&&c<='9'&&c!='.')x=x*10+(c^48),c=getchar();if(c=='.')c=getchar();else return x*=f,*this;while(c>='0'&&c<='9')t=t*10+(c^48),s++,c=getchar();while(s--)t/=10.0;x=(x+t)*f;return*this;}Reader&operator>>(__float128&x){char c=getchar();short f=1,s=0;x=0;__float128 t=0;while((c<'0'||c>'9')&&c!='.'){if(c=='-')f*=-1;c=getchar();}while(c>='0'&&c<='9'&&c!='.')x=x*10+(c^48),c=getchar();if(c=='.') c = getchar();else return x*=f, *this;while(c>='0'&&c<='9')t=t*10+(c^48),s++,c=getchar();while(s--)t/=10.0;x=(x+t)*f;return *this;}Reader(){}}cin;
//     struct Writer{ template <typename T> Writer & operator << (T   x) {if(x == 0) return putchar('0'), *this;if(x < 0) putchar('-'), x = -x;static int sta[60], top = 0; while (x)  sta[++top] = x %10, x /= 10; while (top)  putchar(sta[top] + '0'), --top; return *this;} Writer&operator<<(char c){putchar(c);return*this;}Writer&operator<<(const char*str){int cur=0;while(str[cur])putchar(str[cur++]);return *this;} typedef unsigned long long mxdouble; int precision = 6; Writer set_precision(int val) { precision = val; return *this; }template <typename T> T deal_precision(T x) {__float128 tmp = x;for(int i=0;i<=precision;i++)tmp*=10;tmp+=5;for(int i=0;i<=precision;i++) tmp/=10;return (T)tmp;}Writer&operator<<(float x){if(x<0)putchar('-'),x=-x; x=deal_precision(x); mxdouble _=x;x-=(__float128)_;static int sta[60];int top=0;while(_)sta[++top]=_%10,_/=10;if(!top)putchar('0');while(top)putchar(sta[top]+'0'),--top;if(precision==0)return*this;putchar('.');for(int i=0;i<=precision;i++)x*=10;_=x;while(_)sta[++top]=_%10,_/=10;for(int i=0;i<precision-top;i++)putchar('0');while(top)putchar(sta[top]+'0'),--top;return*this;}Writer&operator<<(double x){if(x<0)putchar('-'),x=-x; x = deal_precision(x); mxdouble _=x;x-=(double)_;static int sta[60];int top=0;while(_)sta[++top]=_%10,_/=10;if(!top)putchar('0');while(top)putchar(sta[top]+'0'),--top;if(precision==0)return*this;putchar('.');for(int i=0;i<precision;i++)x*=10;_=x;while(_)sta[++top]=_%10,_/=10;for(int i=0;i<precision-top;i++)putchar('0');while(top)putchar(sta[top]+'0'),--top;return*this;}Writer&operator<<(long double x){if(x<0)putchar('-'),x=-x; x = deal_precision(x); mxdouble _=x;x-=(__float128)_;static int sta[60];int top=0;while(_)sta[++top]=_%10,_/=10;if(!top)putchar('0');while(top)putchar(sta[top]+'0'),--top;if(precision==0)return*this;putchar('.');for(int i=0;i<precision;i++)x*=10;_=x;while(_)sta[++top]=_%10,_/=10;for(int i=0;i<precision-top;i++)putchar('0');while(top)putchar(sta[top]+'0'),--top;return*this;}Writer&operator<<(__float128 x){if(x<0)putchar('-'),x=-x; x = deal_precision(x); mxdouble _=x;x-=(__float128)_;static int sta[60];int top=0;while(_)sta[++top]=_%10,_/=10;if(!top)putchar('0');while(top)putchar(sta[top]+'0'),--top;if(precision==0)return*this;putchar('.');for(int i=0;i<precision;i++)x*=10;_=x;while(_)sta[++top]=_%10,_/=10;for(int i=0;i<precision-top;i++)putchar('0');while(top)putchar(sta[top]+'0'),--top;return*this;}Writer(){}}cout;
// }   const char * endl = "\n"; const char * space = " ";
// #define cin  Fastio :: cin
// #define cout Fastio :: cout
#define int long long
#define rep(i,a,b) for (register int (i) = (a); (i) <= (b); ++(i))
#define pre(i,a,b) for (register int (i) = (a); (i) >= (b); --(i))
using namespace std;
const int mod = 998244353;
int T, n, m, rge;
set<pair<int,int> > st;

char fi[] = "1_01.in";
char fo[] = "1_01.out";
char tmp[] = "resdata.res";

mt19937_64 rnd(random_device{}());

void run(const char fi[], const char fo[]) {
    string str;
    str += "./std < ";
    str += fi;
    str += " > ";
    str += fo;
    system(str.c_str());
}

bool check(const char fi[], const char fo[]) {
    string str;
    str += "./xin < ";
    str += fi;
    str += " > a.out";
    system(str.c_str());
    str.clear();
    str += "diff ";
    str += fo;
    str += " a.out  -q -B -w";
    return system(str.c_str());
}

int readIn(const char fi[]) {
    freopen(fi, "r", stdin);
    int ret; cin >> ret;
    fclose(stdin);
    return ret;
}

int ans[400005];
void encrypt(const char infl[], const char outfl[], const char output[], int ans_cnt) {
    freopen(outfl, "r", stdin);
    rep(i,1,ans_cnt) {
        cin >> ans[i];
        if (ans[i] == -1) ans[i] = 0;
    }
    fclose(stdin);

    freopen(infl, "r", stdin);
    freopen(output, "w", stdout);
    int n, q, s, t1, t2, t3, nowans = 0;
    cin >> n >> q >> s; cout << n << ' ' << q << ' ' << s << '\n';
    rep(i,1,n) cin >> t1, cout << t1 << ' '; cout << '\n';
    rep(i,2,n) cin >> t1 >> t2, cout << t1 << ' ' << t2 << '\n';
    rep(i,1,q) {
        cin >> t1;
        if (t1 == 1) {
            cin >> t2;
            if (s) t1 ^= ans[nowans], t2 ^= ans[nowans];
            cout << t1 << ' ' << t2 << '\n';
        } else {
            cin >> t2 >> t3;
            if (s) t1 ^= ans[nowans], t2 ^= ans[nowans], t3 ^= ans[nowans];
            cout << t1 << ' ' << t2 << ' ' << t3 << '\n';
        } 
        if (s) if ((t1 ^ ans[nowans]) > 2) ++ nowans;
    } 
    fclose(stdin);
    fclose(stdout);
}

void genTree(int n) {
    rep(i,2,n) cout << i << ' ' << (rand() % (i - 1) + 1) << '\n';
}

void genChain(int n) {
    rep(i,2,n) cout << i << ' ' << i - 1 << '\n';
}

void genStick(int n, int prag) {
    genTree(15);
    rep(i,16,n) cout << i << ' ' << ((rand() % prag + 1) + (i - prag - 1)) << '\n';
}

int vis[400050];
int rng(int l, int r) { return uniform_int_distribution<>(l, r)(rnd); }
void taskGen(int kl, int kr, int nl, int nr, int vall, int slim) {
    int k = rnd() % (kr - kl + 1) + kl, n = rnd() % (nr - nl + 1) + nl;
    int st0 = rng(-vall, vall), st1 = rng(-vall, vall), 
        a = rng(-vall, vall), b = rng(-vall, vall), s = rng(-vall, vall);
    if (slim) s = 1;
    cout << k << ' ' << n << '\n';
    cout << st0 << ' ' << st1 << ' ' << a << ' ' << b << ' ' << s << '\n';
    rep(i,1,k-1) cout << (slim ? 1 : rng(-vall, vall)) << ' '; cout << '\n';
}

void subtask(int id_subtask, int idl, int idr, int kl, int kr, int nl, int nr, int vall, int slim) {
    fi[0] = fo[0] = id_subtask + '0';

    rep(id, idl, idr) {
        // int n = __N, m = rand() % __M + __N;
        fi[2] = fo[2] = (id / 10) % 10 + '0', fi[3] = fo[3] = id % 10 + '0';

        cerr << "START GEN : #Sub. " << (long long)id_subtask << " #No. " << (long long)id << '\n';
        
        freopen(fi, "w", stdout);
        taskGen(kl, kr, nl, nr, vall, slim);
        fclose(stdout);

        run(fi, fo);
        
        cerr << "COMPLETED : #Sub. " << (long long)id_subtask << " #No. " << (long long)id << '\n';
    }
    cerr << "Subtask " << (long long)id_subtask << " COMPLETED." << '\n';
}

signed main() {
    srand(rnd());
    system("g++ std.cpp -o std -O2");
    cerr << "START" << '\n';

    subtask(1, 1, 5, 50, 100, 50, 100, 1000, 0);
    subtask(1, 6, 10, 75, 100, 80, 100, mod - 1, 0);

    subtask(2, 1, 5, 90, 100, (1ull << 60), (1ull << 63) - 1, 10000, 0);
    subtask(2, 6, 10, 95, 100, (1ull << 62), (1ull << 63) - 1, mod - 1, 0);

    subtask(3, 1, 5, 4005, 5000, (1ull << 60), (1ull << 63) - 1, 10000, 1);
    subtask(3, 6, 9, 4500, 5000, (1ull << 62), (1ull << 63) - 1, mod - 1, 1);
    subtask(3, 10, 10, 5000, 5000, (1ull << 63) - 2, (1ull << 63) - 1, mod - 1, 1);

    subtask(4, 1, 7, 4950, 5000, (1ull << 62), (1ull << 63) - 1, mod >> 1, 0);
    subtask(4, 8, 15, 4999, 5000, (1ull << 63) - 10, (1ull << 63) - 1, mod - 1, 0);

	return 0;
}



boards/

anymod_fft:

using ll = int64_t;
using db = double;
struct cp {
    db x, y;
    cp(db real = 0, db imag = 0) : x(real), y(imag){};
    cp operator+(cp b) const { return {x + b.x, y + b.y}; }
    cp operator-(cp b) const { return {x - b.x, y - b.y}; }
    cp operator*(cp b) const { return {x * b.x - y * b.y, x * b.y + y * b.x}; }
};
using vcp = vector<cp>;
namespace FFT {
    const db pi = acos(-1);
    vcp Omega(int L) {
        vcp w(L); w[1] = 1;
        for (register int i = 2; i < L; i <<= 1) {
            auto w0 = w.begin() + i / 2, w1 = w.begin() + i;
            cp wn(cos(pi / i), sin(pi / i));
            for (register int j = 0; j < i; j += 2)
                w1[j] = w0[j >> 1], w1[j + 1] = w1[j] * wn;
        } return w;
    } auto W = Omega(1 << 21);

    void DIF(cp *a, int n) {
        cp x, y;
        for (register int k = n >> 1; k; k >>= 1)
            for (register int i = 0; i < n; i += k << 1)
                for (register int j = 0; j < k; ++j)
                    x = a[i + j], y = a[i + j + k],
                    a[i + j + k] = (x - y) *  W[k + j], a[i + j] = x + y;
    }
    void IDIT(cp *a, int n) {
        cp x, y;
        for (register int k = 1; k < n; k <<= 1)
            for (register int i = 0; i < n; i += k << 1)
                for (register int j = 0; j < k; ++j)
                    x = a[i + j], y = a[i + j + k] * W[k + j],
                    a[i + j + k] = x - y, a[i + j] = x + y;
        const db Inv = 1. / n;
        rep(i, 0, n - 1) a[i].x *= Inv, a[i].y *= Inv;
        reverse(a + 1, a + n);
    }
}
namespace Polynomial {
    using poly = vector<int>;

    void DFT(vcp &a) { FFT::DIF(a.data(), a.size()); }
    void IDFT(vcp &a) { FFT::IDIT(a.data(), a.size()); }
    int norm(int n) { return 1 << (__lg(n - 1) + 1); }
    
    poly operator*(poly &a, poly &b) {
        int n = a.size() + b.size() - 1;
        vcp c(norm(n));
        rep(i, 0, a.size() - 1) c[i].x = a[i];
        rep(i, 0, b.size() - 1) c[i].y = b[i];
        DFT(c);
        rep(i, 0, a.size() - 1) c[i] = c[i] * c[i];
        IDFT(c), a.resize(n);
        rep(i, 0, n - 1) a[i] = int(c[i].y * .5 + .5);
        return a;
    }

    poly conv(const poly &a, const poly &b, const int&P) {
        int n = a.size(), m = b.size(), o = n + m - 1, l = norm(o);
        vcp A(l), B(l), c0(l), c1(l);
        for (register int i = 0; i < n; i++) A[i] = cp(a[i] & 0x7fff, a[i] >> 15);
        for (register int i = 0; i < m; i++) B[i] = cp(b[i] & 0x7fff, b[i] >> 15);
        FFT::DIF(A.data(), l), FFT::DIF(B.data(), l);
        for (register int k = 1, i = 0, j; k < l; k <<= 1)
            for (register ; i < k * 2; i++) {
                j = i ^ k - 1;
                c0[i] = cp(A[i].x + A[j].x, A[i].y - A[j].y) * B[i] * 0.5;
                c1[i] = cp(A[i].y + A[j].y, -A[i].x + A[j].x) * B[i] * 0.5;
            }
        FFT::IDIT(c0.data(), l), FFT::IDIT(c1.data(), l);
        poly res(o);
        for (register int i = 0; i < o; i++) {
            ll c00 = c0[i].x + 0.5, c01 = c0[i].y + 0.5, c10 = c1[i].x + 0.5, c11 = c1[i].y + 0.5;
            res[i] = (c00 + ((c01 + c10) % P << 15) + (c11 % P << 30)) % P;
        }
        return res;
    }
} using namespace Polynomial;

poly F[N];

fwt:

#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
#define rep(i,a,b) for (register int i = (a), i##_ = (b) + 1; i < i##_; ++i)
#define pre(i,a,b) for (register int i = (a), i##_ = (b) - 1; i > i##_; --i)
const int N = 1e6 + 10, mod = 998244353, inv2 = 499122177;
int n, m, a[1 << 17], b[1 << 17], A[1 << 17], B[1 << 17], C[1 << 17];

inline void OR(int f[], int limit, int type = 1) {
    for (int mid = 1, len = 2; len <= limit; mid <<= 1, len <<= 1) {
        for (int i = 0; i < limit; i += len) {
            for (int j = 0; j < mid; ++ j) {
                f[i + j + mid] = (f[i + j + mid] + 1ll * f[i + j] * type) % mod;
            }
        } 
    }
}

inline void AND(int f[], int limit, int type = 1) {
    for (int mid = 1, len = 2; len <= limit; mid <<= 1, len <<= 1) {
        for (int i = 0; i < limit; i += len) {
            for (int j = 0; j < mid; ++ j) {
                f[i + j] = (f[i + j] + 1ll * f[i + j + mid] * type) % mod;
            }
        }
    }
}

inline void XOR(int f[], int limit, int type = 1) {
    for (int mid = 1, len = 2; len <= limit; mid <<= 1, len <<= 1) {
        for (int i = 0; i < limit; i += len) {
            for (int j = 0; j < mid; ++ j) {
                f[i + j] = (f[i + j] + f[i + j + mid]) % mod;
                f[i + j + mid] = (1ll * f[i + j] - f[i + j + mid] - f[i + j + mid] + (mod << 1)) % mod;
                f[i + j] = 1ll * f[i + j] * type % mod;
                f[i + j + mid] = 1ll * f[i + j + mid] * type % mod;
            }
        }
    }
}

void getFWT(int A[], int B[], int C[], int type) {
    for (int i = 0; i < n; ++ i) a[i] = A[i];
    for (int i = 0; i < n; ++ i) b[i] = B[i];
    if (type == 1) OR(a, n, 1), OR(b, n, 1);
    if (type == 2) AND(a, n, 1), AND(b, n, 1);
    if (type == 3) XOR(a, n, 1), XOR(b, n, 1);
    for (int i = 0; i < n; ++ i) a[i] = 1ll * a[i] * b[i] % mod;
    if (type == 1) OR(a, n, mod - 1);
    if (type == 2) AND(a, n, mod - 1);
    if (type == 3) XOR(a, n, inv2);
    for (int i = 0; i < n; ++ i) C[i] = a[i];
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> m; n = 1 << m;
    for (int i = 0; i < n; ++ i) cin >> A[i];
    for (int i = 0; i < n; ++ i) cin >> B[i];
    getFWT(A, B, C, 1);
    for (int i = 0; i < n; ++ i) cout << C[i] << ' '; cout << endl;
    getFWT(A, B, C, 2);
    for (int i = 0; i < n; ++ i) cout << C[i] << ' '; cout << endl;
    getFWT(A, B, C, 3);
    for (int i = 0; i < n; ++ i) cout << C[i] << ' '; cout << endl;
}

polynomial:

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define rep(i, a, b) for (register int(i)=(a), i##_=(b) + 1; (i)<i##_; ++(i))
#define pre(i, a, b) for (register int(i)=(a), i##_=(b) - 1; (i) > i##_; --(i))
using namespace std;

const int N=3e5 + 10, mod=998244353, g=3;
const int siz_int=sizeof(int);

#ifdef ONLINE_JUDGE
    char buf[1<<21], *p1=buf, *p2=buf;  inline char getc() { return (p1 == p2 && (p2=(p1=buf) + fread(buf, 1, 1<<21, stdin), p1 == p2) ? EOF : *p1++); }
    #define getchar getc
#endif
template <typename T> inline void get(T&x){
	x=0; char ch=getchar(); bool f=false; while (ch<'0' or ch > '9') f=f or ch == '-',  ch=getchar();
	while (ch >= '0' and ch <= '9') x=(x<<1) + (x<<3) + (ch^48), ch=getchar(); f && (x=-x);
} template <typename T, typename ... Args> inline void get(T&x, Args&... _Args) { get(x); get(_Args...); }

int n, m, len=1, a[N], cnt[N], ifv[N];

typedef long long ll; typedef __int128 lll;
struct FastMod { int m; ll b; FastMod(int _m) { m=_m; b=((lll)1<<64) / m; } int operator() (ll a) {ll q=((lll)a*b) >> 64; a -= q*m; if (a >= m) a -= m; return a; } } Mod(mod);
int add(int a, int b) { return (a += b) >= mod ? a - mod : a; } template <typename ...Args> int add(int a, Args ...b) { return add(a, add(b...)); }
int mul(int a, int b) { return Mod(1ll*a*b); } template <typename ...Args> int mul(int a, Args ...b) { return mul(a, mul(b...)); }

int btrs[N << 1];
inline int initrs(int k) {
    int limit=1;
    while (limit<k) limit <<= 1;
    for (register int i=0 ;i<limit; i ++) btrs[i]=(btrs[i >> 1] >> 1) | ((i&1) ? limit >> 1 : 0);
    return limit;
}

inline int qp(int a, int b) {
    int ret=1;
    while (b) {
        if (b&1) ret=mul(ret, a);
        a=mul(a, a);
        b >>= 1;
    } return ret;
} inline int inv(int a) { return qp(a, mod-2); }
const int invg=inv(g), inv2=(mod + 1) >> 1;

const int L=1 << 21;
int w[2][L];
int IUR() {
    w[0][0]=w[1][0]=1; int wn=qp(g, (mod-1) / L);
    for (register int i=1;i<L; i++) w[0][L - i]=w[1][i]=mul(w[1][i - 1], wn);
    return 1;
} int dummy=IUR();

struct poly {
    vector <int> f; 
    int operator [] (const int&pos) const { return f[pos]; }
    int&operator [] (const int&pos) { return f[pos]; }
    int deg() {return f.size(); }
    int deg() const  {return f.size(); }
    void Set(int n) { f.resize(n); }
    void Adjust() { while (f.size() > 1 and f.back() == 0) f.pop_back(); }
    void Reverse() { reverse(f.begin(), f.end()); }
    void scan(int n=-1) { if (n<0) get(n); Set(n); for (register int i=0;i<n; i++) get(f[i]); }
    void print() { for (int x : f) printf("%d ", x); }
	void getFac(int k) { Set(k); f[0]=1; for (int i=1; i <= k; i++) f[i]=mul(f[i - 1], i); }
	void getInv(int k) { Set(k); f[0]=f[1]=1; for (int i=1; i <= k;++i) f[i]=mul(mod - mod / i, f[mod%i]); }
    void deri() { for (register int i=0; i + 1<(int)f.size(); ++i) f[i]=mul(f[i+1], i+1); f.back()=0; }
    void intg() { for (register int i=f.size() - 1; i >= 1; --i) f[i]=mul(f[i-1], inv(i)); f[0]=0; }
    poly Deri() { 
        poly ret; ret.Set(deg());
        for (int i=0; i + 1<deg(); ++i) {
            ret[i]=mul(f[i+1], i+1);
        } return ret;
    } poly Intg() {
        poly ret, inv; ret.Set(deg()), inv.getInv(deg() - 1);
        for (int i=deg() - 1; i >= 1; --i) {
            ret[i]=mul(f[i-1], inv[i]);
        } return ret;
    }
    inline void NTT (const int lim, const int type) {
        Set(lim); 
        for (register int i=0;i<lim; i++) if (i<btrs[i]) swap(f[i], f[btrs[i]]);
        for (register int mid=1, y; mid<lim; mid <<= 1) {
            for (register int i=L / (mid<<1), j=0; j<lim; j += (mid << 1)) {
                for (register int k=0; k<mid; k++) {
                    y=mul(w[type][i*k], f[j + k + mid]);
                    f[j + k + mid]=add(f[j + k], mod - y);
                    f[j + k]=add(f[j + k], y);
                }
            }
        } if (type == 1) return;
        int inv=qp(lim, mod - 2);
        for (register int i=0;i<lim; i++) f[i]=mul(f[i], inv);
    } 
    friend poly operator + (const poly&x, const poly&y) {
        poly ret; ret.Set(max(x.deg(), y.deg()));
        for (register int i=0;i<x.deg(); ++i) ret[i]=x[i];
        for (register int i=0;i<y.deg(); ++i) ret[i]=add(ret[i], y[i]);
        return ret;
    } void operator += (const poly&x) {
        Set(max(deg(), x.deg()));
        for (register int i=0;i<x.deg(); ++i) f[i]=add(f[i], x[i]);
    } 
    friend poly operator - (const poly&x, const poly&y) {
        poly ret; ret.Set(max(x.deg(), y.deg()));
        for (register int i=0;i<x.deg(); ++i) ret[i]=x[i];
        for (register int i=0;i<y.deg(); ++i) ret[i]=add(ret[i], mod - y[i]);
        return ret;
    } void operator -= (const poly&x) {
        Set(max(deg(), x.deg()));
        for (register int i=0;i<x.deg(); ++i) f[i]=add(f[i], mod - x[i]);
    } 
    friend poly operator*(const poly&x, const poly&y) {
        poly ret, A=x, B=y;
        int limit=initrs(A.deg() + B.deg() - 1);
        A.NTT(limit, 1), B.NTT(limit, 1); ret.Set(limit);
        for (register int i=0;i<limit; i++) ret[i]=mul(A[i], B[i]);
        ret.NTT(limit, 0); ret.Adjust();
        return ret;
    } void operator *= (const poly&x) {
        poly A=x;
        int limit=initrs(deg() + A.deg() - 1);
        A.NTT(limit, 1); NTT(limit, 1);
        for (register int i=0;i<limit; i++) f[i]=mul(A[i], f[i]);
        NTT(limit, 0); Adjust();
    }
    friend poly operator / (const poly&x, const poly&y) {
        poly A=x, B=y;
        A.Reverse(), B.Reverse(); B.Set(x.deg() - y.deg() + 1);
        B=B.Inv(); B *= A;
        B.Set(x.deg() - y.deg() + 1); B.Reverse();
        return B;
    }
    friend pair<poly,poly> operator%(const poly&x, const poly&y) {
        poly A=x, B=y;
        A.Reverse(), B.Reverse(); B.Set(x.deg() - y.deg() + 1);
        B=B.Inv(); B *= A;
        B.Set(x.deg() - y.deg() + 1); B.Reverse();
        poly R=x - B*y; R.Set(y.deg() - 1);
        return {B, R};
    }
    poly Inv() {
        poly ret; ret.Set(1);
        if (f.empty()) return ret;
        ret[0]=inv(f[0]); poly A, B;
        for (register int len=2, limit; len<(deg() << 1); len <<= 1) {
            A.f.assign((*this).f.begin(), (*this).f.begin() + min(len, deg()));
            B=ret; B.Set(min(len, deg()));
            limit=initrs(A.deg() + B.deg() - 1);
            A.NTT(limit, 1); B.NTT(limit, 1);
            ret.Set(limit);
            for (register int i=0;i<limit; i++) ret[i]=mul(add(2, mod - mul(A[i], B[i])), B[i]);
            ret.NTT(limit, 0);
            ret.Set(len);
        } ret.Set(deg()); return ret;
    }
    poly Ln() {
        poly ret=Deri(), Iv=Inv();
        ret *= Iv; ret.intg(); ret.Set(deg());
        return ret;
    } 
    poly Exp() {
        poly ret; ret.Set(1); ret[0]=1;
        poly A, B;
        for (register int len=2; len<(deg() << 1); len <<= 1) {
            ret.Set(len); A=ret.Ln();
            B.f.assign((*this).f.begin(), (*this).f.begin() + min(len, deg()));
            B -= A; B[0]++; ret *= B;
            ret.Set(len);
        } ret.Set(deg()); return ret;
    }
    poly Sqrt() {
        poly ret; ret.Set(1); ret[0]=1;
        poly A, B;
        for (register int len=2; len<(deg() << 1); len <<= 1) {
            ret.Set(len); A=ret.Inv();
            B.f.assign((*this).f.begin(), (*this).f.begin() + min(len, deg()));
            A *= B;
            for (int i=0;i<len; i++) ret[i]=mul(ret[i] + A[i], inv2);
            ret.Set(len);
        } ret.Set(deg()); return ret;
	}
	void getS2_line(int n) {
		poly jc, inv, ret;
		jc.getFac(n), inv.getInv(n);
		poly A, B; A.Set(n + 1), B.Set(n + 1);
		for (int i=0; i <= n; i++) A[i]=(i&1 ? mod - inv[i] : inv[i] ), B[i]=mul(qp(i,n), inv[i]);
		(*this)=A*B;
		Set(n + 1);
	}
} F;

namespace __POLY__{
    namespace tdef{typedef int i32;typedef unsigned int u32;typedef long long i64;typedef unsigned long long u64;typedef vector<i32>vi32;typedef vector<u32>vu32;typedef vector<i64>vi64;typedef vector<u64>vu64;}const int N=3e6+10,mod=998244353,gen=3;namespace math{using namespace tdef;template<typename T=int>inline T qp(i64 x,int y,i64 ans=1){for(y<0?y+=mod-1:0;y;y>>=1,x=x*x%mod)y&1?ans=ans*x%mod:0;return ans;}inline constexpr int lg(u32 x){return x==0?-1:((int)sizeof(int)*__CHAR_BIT__-1-__builtin_clz(x));}inline u32 fst_mul(u32 x,u64 p,u64 q){return x*p-(q*x>>32)*mod;}const u32 modm2=mod+mod;namespace basic_math{vu32 __fac({1,1}),__ifc({1,1}),__inv({0,1});inline void __prep(int n){static int i=2;if(i<n)for(__fac.resize(n),__ifc.resize(n),__inv.resize(n);i<n;i++)__fac[i]=1ll*i*__fac[i-1]%mod,__inv[i]=1ll*(mod-mod/i)*__inv[mod%i]%mod,__ifc[i]=1ll*__inv[i]*__ifc[i-1]%mod;}inline u32 gfac(u32 x){return __prep(x+1),__fac[x];}inline u32 gifc(u32 x){return __prep(x+1),__ifc[x];}inline u32 ginv(u32 x){return __prep(x+1),__inv[x];}}namespace cipolla{u32 I=0;struct cpl{u32 x,y;cpl(u32 _x=0,u32 _y=0):x(_x),y(_y){}inline cpl operator*(const cpl&a)const{return cpl((1ull*x*a.x+1ull*I*y%mod*a.y)%mod,(1ull*x*a.y+1ull*y*a.x)%mod);}};inline cpl cplpow(cpl a,int y,cpl b=cpl(1,0)){for(;y;y>>=1,a=a*a)if(y&1)b=b*a;return b;}inline u32 isqrt(u32 x){static mt19937 rnd(998244353);if(mod==2||!x||x==1)return x;u32 a=0;do{a=rnd()%mod;}while(qp((1ull*a*a+mod-x)%mod,mod>>1)!=mod-1);I=(1ll*a*a+mod-x)%mod;a=cplpow(cpl(a,1),(mod+1)>>1).x;return min(a,mod-a);}}using basic_math::gfac;using basic_math::gifc;using basic_math::ginv;using cipolla::isqrt;}namespace polynormial{using namespace tdef;const int maxbit=23;using math::lg,math::qp,math::gfac,math::gifc,math::ginv;namespace fast_number_theory_transform{using math::modm2,math::fst_mul;template<class T>inline void butterfly(T*p,int bit){for(u32 i=0,j=0;i<(1u<<bit);i++){if(i>j)swap(p[i],p[j]);for(u32 l=1u<<(bit-1);(j^=l)<l;l>>=1);}}u32*_p0[maxbit+1],*_p1[maxbit+1];inline void prep(int bit){static int k=0;u64 g;for(u32*p,*q,nl;k<bit;k++){nl=1<<k;g=qp(3,mod>>(k+1));p=_p0[k]=new u32[nl<<1];q=p+nl;for(int i=p[0]=1;i<nl;i++)p[i]=p[i-1]*g%mod;for(int i=0;i<nl;i++)q[i]=(u64(p[i])<<32)/mod;g=qp(g,-1);p=_p1[k]=new u32[nl<<1];q=p+nl;for(int i=p[0]=1;i<nl;i++)p[i]=p[i-1]*g%mod;for(int i=0;i<nl;i++)q[i]=(u64(p[i])<<32)/mod;}}template<class T>inline bool chkzero(const T*p,int bit){int i=0;for(;i+16<(1<<bit);i+=16){if(p[i]|p[i^1]|p[i^2]|p[i^3]|p[i^4]|p[i^5]|p[i^6]|p[i^7]|p[i^8]|p[i^9]|p[i^10]|p[i^11]|p[i^12]|p[i^13]|p[i^14]|p[i^15])return 0;}for(;i<(1<<bit);i++)if(p[i])return 0;return 1;}void ntt(u32*a,int bit,bool f=0){prep(bit);if(chkzero(a,bit))return;for(int k=bit;k-->0;){u32*_p=_p0[k],*_q=_p+(1<<k),*_a0=a,*_a1=a+(1<<k),x,y;for(int i=0;i<1<<(bit-k-1);i++,_a0+=2<<k,_a1+=2<<k)for(int j=0;j<(1<<k);++j){x=_a0[j],y=_a1[j];_a0[j]=x+y-(x+y>=modm2)*modm2,_a1[j]=fst_mul(x+modm2-y,_p[j],_q[j]);}}for(int i=0;i<(1<<bit);i++)a[i]-=(a[i]>=modm2)*modm2,a[i]-=(a[i]>=mod)*mod;if(f)butterfly(a,bit);}void intt(u32*a,int bit,bool f=0){prep(bit);if(chkzero(a,bit))return;if(f)butterfly(a,bit);for(int k=0;k<bit;k++){u32*_p=_p1[k],*_q=_p+(1<<k),*_a0=a,*_a1=a+(1<<k),x,y;for(int i=0;i<1<<(bit-k-1);i++,_a0+=2<<k,_a1+=2<<k)for(int j=0;j<(1<<k);++j){x=_a0[j]-(_a0[j]>=modm2)*modm2,y=fst_mul(_a1[j],_p[j],_q[j]);_a0[j]=x+y,_a1[j]=x+modm2-y;}}u64 iv=mod;iv<<=bit;iv=(iv-mod+1)>>bit;for(int i=0;i<(1<<bit);i++)a[i]=a[i]*iv%mod;}}using fast_number_theory_transform::ntt;using fast_number_theory_transform::intt;struct poly{vu32 f;poly(u32 x=0):f(1){f[0]=x;}poly(int x):f(1){f[0]=x+((x>>31)&mod);} poly(const vu32&_f):f(_f){}poly(const vi32&_f){f.resize(f.size());for(int i=0;i<_f.size();i++){f[i]=_f[i]+((_f[i]>>31)&mod);}}template<typename T>poly(initializer_list<T>_f):poly(vector<T>(_f)){}template<typename T>poly(T __first,T __last):poly(vector<typename iterator_traits<T>::value_type>(__first,__last)){}inline operator vu32()const{return f;}inline void swap(poly&_f){f.swap(_f.f);}inline int degree()const{return f.size()-1;}inline poly&redegree(int x){return f.resize(x+1),*this;}inline void clear(){f.resize(1);f[0]=0;}inline void shrink(){int ndeg=f.size()-1;while(ndeg>0&&f[ndeg]==0)ndeg--;f.resize(ndeg+1);}inline poly slice(int n)const{return n<=0?poly(0):(n<f.size()?poly(f.begin(),f.begin()+n+1):poly(*this).redegree(n));}inline u32&operator[](u32 x){return f[x];}inline u32 operator[](u32 x)const{return f[x];}inline u32 get(u32 x)const{return x<f.size()?f[x]:0;}friend ostream&operator<<(ostream&out,const poly&x){out<<x.f[0];for(int i=1;i<x.f.size();i++)out<<' '<<x.f[i];return out;}inline u32*data(){return f.data();}inline const u32*data()const{return f.data();}inline poly&operator+=(const poly&a){f.resize(max(f.size(),a.f.size()));for(int i=0;i<a.f.size();i++)f[i]=f[i]+a.f[i]-(f[i]+a.f[i]>=mod)*mod;return*this;}inline poly&operator-=(const poly&a){f.resize(max(f.size(),a.f.size()));for(int i=0;i<a.f.size();i++)f[i]=f[i]-a.f[i]+(f[i]<a.f[i])*mod;return*this;}inline poly operator+(const poly&a)const{return(poly(*this)+=a);}inline poly operator-(const poly&a)const{return(poly(*this)-=a);}friend inline poly operator+(u32 a,const poly&b){return(poly(b)+=a);}friend inline poly operator-(u32 a,const poly&b){return(poly(a)-=b);}inline poly operator-()const{poly _f;_f.f.resize(f.size());for(int i=0;i<_f.f.size();i++)_f.f[i]=(f[i]!=0)*mod-f[i];return _f;}inline poly&pluswith(const poly&a){for(int i=0,i_up=min(f.size(),a.f.size());i<i_up;i++)f[i]=f[i]+a.f[i]-(f[i]+a.f[i]>=mod)*mod;return*this;}inline poly plus(const poly&a)const{return(poly(*this).pluswith(a));}inline poly&minuswith(const poly&a){for(int i=0,i_up=min(f.size(),a.f.size());i<i_up;i++)f[i]=f[i]-a.f[i]+(f[i]<a.f[i])*mod;return*this;}inline poly minus(const poly&a)const{return(poly(*this).minuswith(a));}inline poly&cornerwith(const poly&a){memcpy(f.data(),a.f.data(),min(a.f.size(),f.size())*4);return*this;}inline poly corner(const poly&a)const{return poly(*this).cornerwith(a);}inline poly&operator*=(const poly&a){int n=degree(),m=a.degree();if(n<16||m<16){f.resize(n+m+1);for(int i=n+m;i>=0;i--){f[i]=1ll*f[i]*a.f[0]%mod;for(int j=max(1,i-n),j_up=min(m,i);j<=j_up;j++)f[i]=(f[i]+1ll*f[i-j]*a.f[j])%mod;}return*this;}vu32 _f(a.f);int bit=lg(n+m)+1;f.resize(1<<bit);_f.resize(1<<bit);ntt(f.data(),bit);ntt(_f.data(),bit);for(int i=0;i<(1<<bit);i++)f[i]=1ll*f[i]*_f[i]%mod;intt(f.data(),bit);f.resize(n+m+1);return*this;}inline poly operator*(const poly&a)const{return(poly(*this)*=a);}inline poly&multiplywith(const poly&_a){poly a(_a);a.shrink();int n=degree(),m=a.degree();if(n<16||m<16){for(int i=n;i>=0;i--){f[i]=1ll*f[i]*a.f[0]%mod;for(int j=max(1,i-n),j_up=min(m,i);j<=j_up;j++)f[i]=(f[i]+1ll*f[i-j]*a.f[j])%mod;}return*this;}int bit=lg(n+m)+1;f.resize(1<<bit);a.f.resize(1<<bit);ntt(f.data(),bit);ntt(a.f.data(),bit);for(int i=0;i<(1<<bit);i++)f[i]=1ll*f[i]*a.f[i]%mod;intt(f.data(),bit);f.resize(n+1);return*this;}inline poly multiply(const poly&a)const{return(poly(*this).multiplywith(a));}template<typename T> inline friend poly operator*(const poly&a, const T&b) {poly ret(a);for (int i=0;i<ret.f.size();++i) ret[i]=1ll*ret[i]*b%mod;return ret;}template<typename T>inline friend poly operator*(const T &b, const poly &a) {poly ret(a);for (int i=0;i<ret.f.size();++i) ret[i]=1ll*ret[i]*b%mod;return ret;} template<typename T> inline poly& operator *= (const T&b) {for (int i=0;i<f.size();++i) f[i]=1ll*f[i]*b%mod;return *this;} inline poly&operator<<=(int x){return f.resize(f.size()+x),memmove(f.data()+x,f.data(),4*(f.size()-x)),memset(f.data(),0,4*x),*this;}inline poly operator<<(int x)const{return(poly(*this)<<=x);}inline poly&operator>>=(int x){return x>=f.size()?(clear(),*this):(memmove(f.data(),f.data()+x,4*(f.size()-x)),f.resize(f.size()-x),*this);}inline poly operator>>(int x)const{return(poly(*this)>>=x);}inline poly&shiftindexwith(int x){return x>=f.size()?(memset(f.data(),0,4*f.size()),*this):(memmove(f.data(),f.data()+x,4*(f.size()-x)),memset(f.data(),0,4*x),*this);}inline poly shiftindex(int x)const{return(poly(*this).shiftindexwith(x));}inline poly inv()const;inline poly quo(const poly&g)const;inline poly&quowith(const poly&g){return f.size()==1?(f[0]=qp(g[0],-1,f[0]),*this):(*this=quo(g));}inline poly deri()const{int n=degree();poly res;res.redegree(n-1);for(int i=1;i<=n;i++)res[i-1]=1ll*f[i]*i%mod;return res;}inline poly intg(u32 C=0)const{int n=degree();poly res(C);res.redegree(n+1);for(int i=0;i<=n;i++)res[i+1]=1ll*ginv(i+1)*f[i]%mod;return res;}inline poly ln()const;inline poly exp()const;inline poly pow(u32 x){return(ln()*x).exp();}inline poly pow(u32 x,u32 x0){return x0!=0?((multiply(qp(f[0],-1)).ln())*x).exp()*x0:poly(0).redegree(degree());}inline poly ivsqrt()const{int nsize=f.size(),mxb=lg(f.size()-1)+1;vu32 a(1<<mxb),_f(f);_f.resize(1<<mxb);a[0]=qp(math::isqrt(f[0]),mod-2);for(int nb=0;nb<mxb;nb++){vu32 _a(a.begin(),a.begin()+(1<<nb)),_b(_f.begin(),_f.begin()+(2<<nb));_a.resize(4<<nb);_b.resize(4<<nb);ntt(_a.data(),nb+2);ntt(_b.data(),nb+2);for(int i=0;i<(4<<nb);i++)_a[i]=1ull*(mod-_a[i])*_a[i]%mod*_a[i]%mod*_b[i]%mod,_a[i]=(_a[i]+(_a[i]&1)*mod)>>1;intt(_a.data(),nb+2);memcpy(a.data()+(1<<nb),_a.data()+(1<<nb),4<<nb);}return a.resize(nsize),a;}inline poly sqrt()const{if(f.size()==1)return poly(math::isqrt(f[0]));int nsize=f.size(),mxb=lg(nsize-1)+1;vu32 a(1<<mxb),_f(f),_b;_f.resize(1<<mxb);a[0]=qp(math::isqrt(f[0]),mod-2);for(int nb=0;nb<mxb-1;nb++){vu32 _a(a.begin(),a.begin()+(1<<nb));_b=vu32(_f.begin(),_f.begin()+(2<<nb));_a.resize(4<<nb);_b.resize(4<<nb);ntt(_a.data(),nb+2);ntt(_b.data(),nb+2);for(int i=0;i<(4<<nb);i++)_a[i]=1ull*(mod-_a[i])*_a[i]%mod*_a[i]%mod*_b[i]%mod,_a[i]=(_a[i]+(_a[i]&1)*mod)>>1;intt(_a.data(),nb+2);memcpy(a.data()+(1<<nb),_a.data()+(1<<nb),4<<nb);}ntt(a.data(),mxb);vu32 _a(a);for(int i=0;i<(1<<mxb);i++)a[i]=1ll*a[i]*_b[i]%mod;intt(a.data(),mxb),memset(a.data()+(1<<(mxb-1)),0,2<<mxb);vu32 g0(a);ntt(a.data(),mxb),ntt(_f.data(),mxb);for(int i=0;i<(1<<mxb);i++)a[i]=(1ll*a[i]*a[i]+mod-_f[i])%mod*(mod-_a[i])%mod,a[i]=(a[i]+(a[i]&1)*mod)>>1;intt(a.data(),mxb);memcpy(g0.data()+(1<<(mxb-1)),a.data()+(1<<(mxb-1)),2<<mxb);return g0;}};namespace __semiconvol__{const int logbr=4,br=1<<logbr,maxdep=(maxbit-1)/logbr+1,__bf=7,bf=max(__bf,logbr-1),pbf=1<<bf;}inline poly poly::ln()const{using namespace __semiconvol__;int nsize=f.size(),mxb=lg(nsize-1)+1;math::basic_math::__prep(mxb);vu32 res(1<<mxb),__prentt[maxdep][br],_f(f);for(int i=0,k=mxb;k>bf;k-=logbr,i++){for(int j=0;j<br-1;j++){if((j<<(k-logbr))>=nsize)break;__prentt[i][j].resize(2<<(k-logbr));int nl=(j<<(k-logbr)),nr=min(((j+2)<<(k-logbr)),nsize)-nl;memcpy(__prentt[i][j].data(),_f.data()+nl,nr*4);ntt(__prentt[i][j].data(),k-logbr+1);}}function<void(int,int,int)>__div=[&res,&__prentt,&_f,&mxb,&__div](int x,int l,int r){if(r-l<=pbf){for(int i=l;i<r;i++){if(i==0)res[i]=0;else{res[i]=(1ll*i*_f[i]+mod-res[i])%mod;if(i+1<r){u64 __tmp=res[i];for(int j=i+1;j<r;j++)res[j]=(res[j]+__tmp*_f[j-i])%mod;}}}return;}int nbit=mxb-logbr*(x+1),nbr=0;vu32 __tmp[br];while(l+(nbr<<nbit)<r){__tmp[nbr].resize(2<<nbit);nbr++;}for(int i=0;i<nbr;i++){if(i!=0){intt(__tmp[i].data(),nbit+1);for(int j=0;j<(1<<nbit);j++){u32&x=res[l+(i<<nbit)+j],&y=__tmp[i][j+(1<<nbit)];x=x+y-(x+y>=mod)*mod,y=0;}}__div(x+1,l+(i<<nbit),min(l+((i+1)<<nbit),r));if(i!=nbr-1){memcpy(__tmp[i].data(),res.data()+l+(i<<nbit),4<<nbit);ntt(__tmp[i].data(),nbit+1);for(int j=i+1;j<nbr;j++)for(int k=0;k<(2<<nbit);k++)__tmp[j][k]=(__tmp[j][k]+1ll*__tmp[i][k]*__prentt[x][j-i-1][k])%mod;}}};__div(0,0,nsize);res.resize(nsize);for(int i=nsize-1;i;i--)res[i]=1ll*math::ginv(i)*res[i]%mod;return res;}inline poly poly::exp()const{using namespace __semiconvol__;int nsize=f.size(),mxb=lg(nsize-1)+1;math::basic_math::__prep(mxb);vu32 res(1<<mxb),__prentt[maxdep][br],_f(f);for(int i=0;i<nsize;i++)_f[i]=1ll*i*_f[i]%mod;for(int i=0,k=mxb;k>bf;k-=logbr,i++){for(int j=0;j<br-1;j++){if((j<<(k-logbr))>=nsize)break;__prentt[i][j].resize(2<<(k-logbr));int nl=(j<<(k-logbr)),nr=min(((j+2)<<(k-logbr)),nsize)-nl;memcpy(__prentt[i][j].data(),_f.data()+nl,nr*4);ntt(__prentt[i][j].data(),k-logbr+1);}}function<void(int,int,int)>__div=[&res,&__prentt,&_f,&mxb,&__div](int x,int l,int r){if(r-l<=pbf){for(int i=l;i<r;i++){res[i]=i==0?1:1ll*math::ginv(i)*res[i]%mod;if(i+1<r){u64 __tmp=res[i];for(int j=i+1;j<r;j++)res[j]=(res[j]+__tmp*_f[j-i])%mod;}}return;}int nbit=mxb-logbr*(x+1),nbr=0;vu32 __tmp[br];while(l+(nbr<<nbit)<r){__tmp[nbr].resize(2<<nbit);nbr++;}for(int i=0;i<nbr;i++){if(i!=0){intt(__tmp[i].data(),nbit+1);for(int j=0;j<(1<<nbit);j++){u32&x=res[l+(i<<nbit)+j],&y=__tmp[i][j+(1<<nbit)];x=x+y-(x+y>=mod)*mod,y=0;}}__div(x+1,l+(i<<nbit),min(l+((i+1)<<nbit),r));if(i!=nbr-1){memcpy(__tmp[i].data(),res.data()+l+(i<<nbit),4<<nbit);ntt(__tmp[i].data(),nbit+1);for(int j=i+1;j<nbr;j++)for(int k=0;k<(2<<nbit);k++)__tmp[j][k]=(__tmp[j][k]+1ll*__tmp[i][k]*__prentt[x][j-i-1][k])%mod;}}};__div(0,0,nsize);return res.resize(nsize),res;}inline poly poly::inv()const{using namespace __semiconvol__;int nsize=f.size(),mxb=lg(nsize-1)+1;vu32 res(1<<mxb),__prentt[maxdep][br],_f(f);u32 ivf0=qp(f[0],-1);_f[0]=0;for(int i=0,k=mxb;k>bf;k-=logbr,i++){for(int j=0;j<br-1;j++){if((j<<(k-logbr))>=nsize)break;__prentt[i][j].resize(2<<(k-logbr));int nl=(j<<(k-logbr)),nr=min(((j+2)<<(k-logbr)),nsize)-nl;memcpy(__prentt[i][j].data(),_f.data()+nl,nr*4);ntt(__prentt[i][j].data(),k-logbr+1);}}function<void(int,int,int)>__div=[&res,&__prentt,&_f,&mxb,&__div,&ivf0](int x,int l,int r){if(r-l<=pbf){for(int i=l;i<r;i++){res[i]=i==0?ivf0:1ll*ivf0*(mod-res[i])%mod;if(i+1<r){u64 __tmp=res[i];for(int j=i+1;j<r;j++)res[j]=(res[j]+__tmp*_f[j-i])%mod;}}return;}int nbit=mxb-logbr*(x+1),nbr=0;vu32 __tmp[br];while(l+(nbr<<nbit)<r){__tmp[nbr].resize(2<<nbit);nbr++;}for(int i=0;i<nbr;i++){if(i!=0){intt(__tmp[i].data(),nbit+1);for(int j=0;j<(1<<nbit);j++){u32&x=res[l+(i<<nbit)+j],&y=__tmp[i][j+(1<<nbit)];x=x+y-(x+y>=mod)*mod,y=0;}}__div(x+1,l+(i<<nbit),min(l+((i+1)<<nbit),r));if(i!=nbr-1){memcpy(__tmp[i].data(),res.data()+l+(i<<nbit),4<<nbit);ntt(__tmp[i].data(),nbit+1);for(int j=i+1;j<nbr;j++)for(int k=0;k<(2<<nbit);k++)__tmp[j][k]=(__tmp[j][k]+1ll*__tmp[i][k]*__prentt[x][j-i-1][k])%mod;}}};__div(0,0,nsize);return res.resize(nsize),res;}inline poly poly::quo(const poly&g)const{using namespace __semiconvol__;int nsize=f.size(),mxb=lg(nsize-1)+1;vu32 res(1<<mxb),__prentt[maxdep][br],_f(g.f);u32 ivf0=qp(_f[0],-1);_f[0]=0;_f.resize(nsize);for(int i=0,k=mxb;k>bf;k-=logbr,i++){for(int j=0;j<br-1;j++){if((j<<(k-logbr))>=nsize)break;__prentt[i][j].resize(2<<(k-logbr));int nl=(j<<(k-logbr)),nr=min(((j+2)<<(k-logbr)),nsize)-nl;memcpy(__prentt[i][j].data(),_f.data()+nl,nr*4);ntt(__prentt[i][j].data(),k-logbr+1);}}function<void(int,int,int)>__div=[=,&res,&__prentt,&_f,&mxb,&__div,&ivf0](int x,int l,int r){if(r-l<=pbf){for(int i=l;i<r;i++){res[i]=1ll*ivf0*(i==0?f[0]:f[i]+mod-res[i])%mod;if(i+1<r){u64 __tmp=res[i];for(int j=i+1;j<r;j++)res[j]=(res[j]+__tmp*_f[j-i])%mod;}}return;}int nbit=mxb-logbr*(x+1),nbr=0;vu32 __tmp[br];while(l+(nbr<<nbit)<r){__tmp[nbr].resize(2<<nbit);nbr++;}for(int i=0;i<nbr;i++){if(i!=0){intt(__tmp[i].data(),nbit+1);for(int j=0;j<(1<<nbit);j++){u32&x=res[l+(i<<nbit)+j],&y=__tmp[i][j+(1<<nbit)];x=x+y-(x+y>=mod)*mod,y=0;}}__div(x+1,l+(i<<nbit),min(l+((i+1)<<nbit),r));if(i!=nbr-1){memcpy(__tmp[i].data(),res.data()+l+(i<<nbit),4<<nbit);ntt(__tmp[i].data(),nbit+1);for(int j=i+1;j<nbr;j++)for(int k=0;k<(2<<nbit);k++)__tmp[j][k]=(__tmp[j][k]+1ll*__tmp[i][k]*__prentt[x][j-i-1][k])%mod;}}};__div(0,0,nsize);return res.resize(nsize),res;}}using math::qp;using polynormial::poly;
} using namespace __POLY__;

sa and sth:

/usr/bin/time -f "%es, %MKB" ./std

const int N = 1e6 + 10;
char ch[N];
int n, sa[N], rk[N];
void getsa(char ch[], int sa[], int rk[]) {
    int m = 127;
    static int cnt[N], rk2[N], key[N], id[N];
    memset(cnt+1, 0, m << 2);
    rep(i,1,n) rk[i] = ch[i], cnt[rk[i]]++;
    rep(i,1,m) cnt[i] += cnt[i-1];
    pre(i,n,1) sa[cnt[rk[i]] --] = i;
    for (int w = 1; ; w <<= 1) {
        int p = 0;
        for (register int i = n; i > n - w; -- i) id[++p] = i;
        rep(i,1,n) if (sa[i] > w) id[++p] = sa[i] - w;
        memset(cnt + 1, 0, m << 2);
        rep(i,1,n) key[i] = rk[id[i]], cnt[key[i]]++;
        rep(i,1,m) cnt[i] += cnt[i-1];
        pre(i,n,1) sa[cnt[key[i]] --] = id[i];
        memcpy(rk2+1, rk+1, n << 2);
        p = 0;
        rep(i,1,n) rk[sa[i]] = (
                        rk2[sa[i]] == rk2[sa[i-1]] and 
                        rk2[sa[i] + w] == rk2[sa[i-1] + w]
                     ) ? p : ++p;
        if (p == n) { rep(i,1,n) sa[rk[i]] = i; break; }
        m = p;
    }
}

void getheight() {
    for (int i = 1, k = 0; i <= n; i++) {
        if (rk[i] == 0) continue;
        if (k) k--;
        while (s[i + k] == s[sa[rk[i] - 1] + k]) k++;
        height[rk[i]] = k;
    }
}

typedef long long ll; typedef __int128 lll;
struct FastMod { int m; ll b; void init(int _m) { m = _m; b = ((lll)1<<64) / m; } int operator() (ll a) {ll q = ((lll)a * b) >> 64; a -= q * m; if (a >= m) a -= m; return a; } } Mod;
int add(ll a, int b) { return (a += b) >= mod ? a - mod : a; } int mul(int a, int b) { return Mod(1ll * a * b); } template <typename ...Args> int mul(int a, Args ...b) { return mul(a, mul(b...)); }

#pragma GCC target("sse,sse2,sse3,sse4.1,sse4.2,popcnt,abm,mmx,avx")
#pragma comment(linker, "/STACK:102400000,102400000")
#pragma GCC optimize("Ofast,inline,-fgcse,-fgcse-lm,-fipa-sra,-ftree-pre,-ftree-vrp,-fpeephole2,-ffast-math,-fsched-spec,unroll-loops,-falign-jumps,-falign-loops,-falign-labels,-fdevirtualize,-fcaller-saves,-fcrossjumping,-fthread-jumps,-funroll-loops,-fwhole-program,-freorder-blocks,-fschedule-insns,inline-functions,-ftree-tail-merge,-fschedule-insns2,-fstrict-aliasing,-fstrict-overflow,-falign-functions,-fcse-skip-blocks,-fcse-follow-jumps,-fsched-interblock,-fpartial-inlining,no-stack-protector,-freorder-functions,-findirect-inlining,-fhoist-adjacent-loads,-frerun-cse-after-loop,inline-small-functions,-finline-small-functions,-ftree-switch-conversion,-foptimize-sibling-calls,-fexpensive-optimizations,-funsafe-loop-optimizations,inline-functions-called-once,-fdelete-null-pointer-checks")

标签:__,const,int,环境,poly,return,mod
From: https://www.cnblogs.com/joke3579/p/envir.html

相关文章

  • 在Linux环境中安装JDK
    一linux软件安装常用的方式对比Linux下的软件安装,主要有如下三种,“正规”程度依次递减:1、使用标准的yum/apt/yast包管理程序安装2、使用标准rpm/deb或厂商自己的安装包(比如......
  • 虚拟机Ubuntu环境下的Linux驱动开发环境搭建
    安装Ubuntu版本longtime版本,目前最新是22.04,下边是下载网址https://ubuntu.com/download/desktop具体的安装虚拟机和Ubuntu的教程,下边是参考教程网址https://blog.csd......
  • Windows下开发环境的搭建(前端vue后端java)
    0.下载或拷贝jdk(目前项目使用的版本包括1.6,1.7,1.8,11),配置Java环境变量:新建系统变量JAVA_HOME和CLASSPATH变量名:JAVA_HOME变量值:C:\ProgramFiles\Java\jdk1.7.0......
  • Java开发环境安装与配置(干货详细教程)
    Java开发环境安装与配置(干货详细教程) 对于文章中出现的任何错误请大家批评指出,会及时做出修改! 安装JDKJDK是Java语言的软件开发工具包链接Java中国官网https:/......
  • vscode中文环境配置
    1.背景2.配置2.1.安装中文包如果没有按照中文插件需要先按照中文插件  如果你是首次安装,安装完成后会引导你重启,就可以了2.2.设置成中文环境打开VSCode软件,按......
  • 详解.env文件配置---全局环境变量
    一、.env文件说明.env---全局默认配置文件,在所有的环境中被载入,当你指定了环境,它也会合并,并且优先级大于.env,没有指定环境时先找它.env.development---指定开发......
  • 开发笔记1.0-配置Linux的必要开发环境
    1.连接云服务器使用工具:putty和Winscp2.安装JDKCentOS使用yum命令下载JDK8#安装JDK1.8yuminstalljava-1.8.0-openjdkjava-1.8.0openjdk-devel3.安装MySQL5.7......
  • 安装conda(mini)后创建虚拟环境时报错:"In general, it's not advisable to use 'sudo
    报错信息:解决办法:(使用下面的命令改变conda相关文件夹的权限,-r递归应用于子文件夹) sudochmod777-R~/miniconda3/  sudochmod777-R~/.conda/  解决。......
  • STM32CubeMX+Keil5环境创建
    1、打开桌面的STM32CubMX软件2、点击File→NewProject创建新的项目 3、选择合适的芯片型号,因为本人是F103ZET6,故选择,双击确定。4、选择合适调试接口 5、将外部......
  • 【Azure 环境】向Azure Key Vault中导入证书有输入密码,那么导出pfx证书的时候,为什么没
    问题描述将pfx证书导入KeyVault的证书时,这个PFX需要输入正确的密码导入成功。但是当需要导出时,生成的pfx证书则不需要密码。这是正常的情况吗?  问题解答是的,这是A......