栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3899 State Reversing

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3899 State Reversing

#include <cstdio>#include <ctime>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <map>#include <set>#include <stack>#include <queue>#include <string>#include <iostream>#include <algorithm>using namespace std;#define getmid(l,r) ((l) + ((r) - (l)) / 2)#define MEM(a,b) memset(a,b,sizeof(a))#define MP(a,b) make_pair(a,b)#define PB push_backtypedef long long ll;typedef pair<int,int> pii;const double eps = 1e-8;const int INF = (1 << 30) - 1;const int P = 880803841;const int G = 26;const int NUM = 30;const int MAXN = (1 << 18) + 10;int T,n,m,D;int rev[MAXN],A1[MAXN],A2[MAXN],wn[2][NUM],inv[MAXN];int dp[MAXN],fac[MAXN],afac[MAXN];int t1[MAXN << 2],t0[MAXN << 2],add[MAXN << 2];int N,bit;int Q_pow(int x,int y,int mod){    int res = 1;    x %= mod;    while(y){        if(y & 1) res = 1ll * res * x % mod;        x = 1ll * x * x % mod;        y >>= 1;    }    return res;}void Pre_cal(int n3){    for(N = 1,bit = 0; N < n3; N <<= 1,++bit);    for(int i = 1; i < N; ++i)        rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1));}void NTT(int *A,int n,int f){    for(int i = 0; i < n; ++i) if(i < rev[i]) swap(A[i],A[rev[i]]);    int id = (f == -1) ? 1 : 0,p = 1;    for(int m = 2; m <= n; m <<= 1,++p){        for(int k = 0; k < n; k += m){ for(int j = k,w = 1; j < k + (m >> 1); ++j){     int t = 1ll * w * A[j + (m >> 1)] % P;     int u = A[j];     if((A[j] = u + t) >= P) A[j] -= P;     if((A[j + (m >> 1)] = u - t) < 0) A[j + (m >> 1)] += P;     w = 1ll * w * wn[id][p] % P; }        }    }    if(f == -1) for(int i = 0; i < n; ++i) A[i] = 1ll * A[i] * inv[n] % P;}void CDQ(int l,int r){    if(l == r) return;    int mid = getmid(l,r);    CDQ(l,mid);    int len = r - l + 1;    Pre_cal(len);    for(int i = 0; i <= mid - l; ++i) A1[i] = dp[i + l];    for(int i = mid - l + 1; i < N; ++i) A1[i] = 0;    for(int i = 0; i < N; ++i) A2[i] = afac[i + 1];    NTT(A1,N,1);    NTT(A2,N,1);    for(int i = 0; i < N; ++i) A1[i] = 1ll * A1[i] * A2[i] % P;    NTT(A1,N,-1);    for(int i = mid - l + 1; i <= r - l; ++i)         dp[i + l] = ((dp[i + l] - A1[i - 1]) % P + P) % P;    CDQ(mid + 1,r);}void Pre(){    fac[0] = 1;    for(int i = 1; i < MAXN; ++i) fac[i] = 1ll * fac[i - 1] * i % P;    afac[MAXN - 1] = Q_pow(fac[MAXN - 1],P - 2,P);    for(int i = MAXN - 1; i >= 1; --i) afac[i - 1] = 1ll * afac[i] * i % P;    for(int i = 1; i < MAXN; ++i) inv[i] = Q_pow(i,P - 2,P);    for(int i = 0; i < NUM; ++i){        int t = 1 << i;        wn[0][i] = Q_pow(G,(P - 1) / t,P);        wn[1][i] = Q_pow(wn[0][i],P - 2,P);    }}void Solve(int top){    dp[1] = 1;    for(int i = 2; i <= top; ++i) dp[i] = 1ll * Q_pow(i,n,P) * afac[i] % P;    CDQ(1,top);}void Push_up(int p){    t1[p] = t1[p << 1] + t1[p << 1|1];    t0[p] = t0[p << 1] + t0[p << 1|1];}void Build(int p,int l,int r){    add[p] = 0;    if(l == r){        t1[p] = 1;        t0[p] = 0;        return;    }    int mid = getmid(l,r);    Build(p << 1,l,mid);    Build(p << 1|1,mid + 1,r);    Push_up(p);}void Push_down(int p){    if(add[p]){        add[p << 1] ^= 1;        add[p << 1|1] ^= 1;        swap(t1[p << 1],t0[p << 1]);        swap(t1[p << 1|1],t0[p << 1|1]);        add[p] = 0;    }}void Update(int a,int b,int p,int l,int r){    if(a <= l && r <= b){        add[p] ^= 1;        swap(t1[p],t0[p]);        return;    }    Push_down(p);    int mid = getmid(l,r);    if(a <= mid) Update(a,b,p << 1,l,mid);    if(b > mid) Update(a,b,p << 1|1,mid + 1,r);    Push_up(p);}int main(){    Pre();    scanf("%d",&T);    while(T--){        scanf("%d%d%d",&n,&m,&D);        Solve(m);        Build(1,1,m);        for(int i = 1; i <= D; ++i){ int a,b; scanf("%d%d",&a,&b); Update(a,b,1,1,m); printf("%dn",dp[t1[1]]);        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/378145.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号