题目

描述

​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径;

​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值;

​ 可以走多条路径;

​ 询问对于\(x \in [1,m] \ , \ y \in [0,n)\),总步数为\(x\),所有路径愉悦值\(and\)和为\(y\)的方案数;

​ 你只需要输出他们的异或值;

范围

​ $n\le 64 \ , \ m \le 20000 $;

题解

  • 令\(w_{i,j}\)为\(i\)步值为\(j\)的方案,做\(fmt\);

  • 根据\(w_{i,j}\)得出\(H_{i,j}\)表示\(and\)值为\(i\),步数为\(j\)的方案数;

  • 可以用多项式求逆求出\(1 + H_{i} + H_{i}^2 + \cdots = \frac{1}{1-H_{i}}\);

  • 取前\(m\)项得到答案的\(w_{i,j}\)再\(ifmt\);

  • 求\(w_{i,j}\)需要求\(A^i\);

  • 直接用矩阵乘法求$ A^i $是 $ n^3m $ 的;

  • 考虑\(Q_S(A^i)\)为\(A^i\)中\(and\)值为\(S\)的方案数;

  • 运算满足定律:

  • $Q_S(A+B) \ = \ Q_S(A) \ + \ Q_S(B) $ ;

  • \(Qs(kA) \ = \ k \ Q_S(A)\);

  • 根据\(Cayley-Hamilton\),令\(k = rk(A)\) ;

  • 设\(A\)的特征多项式为:\(F(x)\)

  • 对于任意正常数\(w\)都有:

    \[\begin{align}
    \sum_{i=0}^{k} a_iA_i = 0 \\
    \sum_{i=0}^{k} a_iA^{i+w} = 0\\
    Q_S(\sum_{i=0}^{k} a_iA^{i+w}) = 0\\
    \sum_{i=0}^{k} a_i \ Q_S(A^{i+w}) = 0\\
    \end{align}
    \]

  • 这启示我们在\(Q_S(A^i)\)中存在一个\(k \le n\)阶的齐次递推;

  • 所以只要\(O(n^4)\)求出前\(n+1\)项高斯消元解出\(a_i\)就可以递推\(Q_S\);

    #include<bits/stdc++.h>
    #define mod 998244353
    #define ll long long
    using namespace std;
    const int M=80010,N=110;
    int n,m,l,r,a[N][N],b[N][N],c[N][N],w[M][N],f[N],h[N][M],g[N][M],len,L,rev[M];
    char gc(){
    static char*p1,*p2,s[1000000];
    if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    int rd(){
    int x=0;char c=gc();
    while(c<'0'||c>'9')c=gc();
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
    return x;
    }
    int pw(int x,int y){
    int re=1;
    if(y<0)y+=mod-1;
    while(y){
    if(y&1)re=(ll)re*x%mod;
    y>>=1;x=(ll)x*x%mod;
    }
    return re;
    }
    void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
    void dec(int&x,int y){x-=y;if(x<0)x+=mod;}
    void fmt(int*A,int l,int F){
    if(~F){
    for(int i=0;i<l;++i)
    for(int j=(1<<l)-1;j>=1<<i;--j)if(j>>i&1)inc(A[j^(1<<i)],A[j]);
    return ;
    }
    for(int i=0;i<l;++i)
    for(int j=1<<i;j<1<<l;++j)if((j>>i)&1)dec(A[j^(1<<i)],A[j]);
    }
    void mul(int A[N][N],int B[N][N],int n){
    static int tmp[N][N];
    for(int i=0;i<n;++i)
    for(int j=0;j<n;++j){
    tmp[i][j]=0;
    for(int k=0;k<n;++k)inc(tmp[i][j],(ll)A[i][k]*B[k][j]%mod);
    }
    for(int i=0;i<n;++i)
    for(int j=0;j<n;++j)A[i][j]=tmp[i][j];
    }
    void gauss(int A[N][N],int n){
    for(int i=0;i<n;++i){
    int pos;for(pos=i;pos<=n&&!A[pos][i];++pos);
    if(pos!=i)for(int j=i;j<=n;++j)swap(A[i][j],A[pos][j]);
    int iv=pw(A[i][i],mod-2);
    for(int j=i;j<=n;++j)A[i][j]=(ll)A[i][j]*iv%mod;
    for(int j=0;j<n;++j)if(i!=j)
    for(int k=n;k>=i;--k)dec(A[j][k],(ll)A[j][i]*A[i][k]%mod);
    }
    for(int i=0;i<n;++i)f[i+1]=A[i][n];
    }
    const int G=3;
    void ntt(int*A,int len,int F){
    for(L=0;1<<L<len;++L);
    for(int i=0;i<len;++i){
    rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
    if(i<rev[i])swap(A[i],A[rev[i]]);
    }
    for(int i=1;i<len;i<<=1){
    int wn=pw(G,F*(mod-1)/(i<<1));
    for(int j=0;j<len;j+=i<<1){
    int w=1;
    for(int k=0;k<i;++k,w=(ll)w*wn%mod){
    int x=A[j+k],y=(ll)w*A[j+k+i]%mod;
    A[j+k]=(x+y)%mod,A[j+k+i]=(x-y+mod)%mod;
    }
    }
    }
    if(!~F){
    int iv=pw(len,mod-2);
    for(int i=0;i<len;++i)A[i]=(ll)A[i]*iv%mod;
    }
    }
    void cpy(int*A,int*B,int l){for(int i=0;i<l;++i)A[i]=B[i];}
    void cls(int*A,int l,int r){for(int i=l;i<r;++i)A[i]=0;}
    void inv(int*A,int*B,int l){
    if(l==0){B[0]=1;return;}
    static int t[M];
    inv(A,B,l>>1);
    int len=l<<1;
    cpy(t,A,l);cls(t,l,len);
    ntt(t,len,1);ntt(B,len,1);
    for(int i=0;i<len;++i)B[i]=(ll)B[i]*(2-(ll)t[i]*B[i]%mod+mod)%mod;
    ntt(B,len,-1);cls(B,l,len);
    }
    int main(){
    freopen("bai.in","r",stdin);
    freopen("bai.out","w",stdout);
    n=rd();m=rd();
    for(l=0;1<<l<n;++l);
    for(int i=0;i<n;++i)
    for(int j=0;j<n;++j)a[i][j]=rd();
    for(int i=0;i<n;++i)b[i][i]=1;
    for(int i=1;i<=n+1;++i){
    mul(b,a,n);
    for(int j=0;j<n;++j)
    for(int k=0;k<n;++k)inc(w[i][j&k],b[j][k]);
    fmt(w[i],l,1);
    }
    for(int i=0;i<n;++i){
    for(int j=0;j<n;++j)c[i][j]=w[n-j][i];
    c[i][n]=w[n+1][i];
    }
    gauss(c,n);
    for(r=n;r&&!f[r];--r);
    for(int i=n+2;i<=m;++i)
    for(int j=0;j<n;++j)
    for(int k=1;k<=r;++k){
    inc(w[i][j],(ll)f[k]*w[i-k][j]%mod);
    }
    for(int i=0;i<n;++i)
    for(int j=1;j<=m;++j)dec(h[i][j],w[j][i]);
    int len=1;for(;len<=m;len<<=1);
    for(int i=0;i<n;++i){
    h[i][0]=1;
    inv(h[i],g[i],len);
    cls(g[i],m+1,len);
    }
    int ans=0;
    for(int i=1;i<=m;++i){
    for(int j=0;j<n;++j)w[i][j]=g[j][i];
    fmt(w[i],l,-1);
    for(int j=0;j<n;++j)ans^=w[i][j];
    }
    cout<<ans<<endl;
    return 0;
    }

【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)的更多相关文章

  1. 【纪中集训2019.3.23】Deadline

    题意 描述 一个二分图\((A,B)\),每个点额外有一个颜色0或者1: 匹配时,只能相同颜色的点匹配: 给出\(A\)中的颜色,问如何分配\(B\)种的颜色使得\((A,B)\)的最大匹配最小: 范 ...

  2. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  3. 【纪中集训2019.3.23】IOer

    题目 描述 你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限: 第\(i\)天可以刷的题目的种类是\(ui+v\): 两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同 ...

  4. 【纪中集训2019.3.11】Cubelia

    题目: 描述 给出长度为\(n\)的数组\(a\)和\(q\)个询问\(l,r\). 求区间\([l,r]\)的所有子区间的前缀和的最大值之和: 范围: $n \le 2 \times 10^5 , ...

  5. 【纪中集训2019.3.13】fft

    题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...

  6. 【纪中集训2019.3.12】Z的礼物

    题意 已知\(a_{i} = \sum_{j=1}^{i} \{^{i} _{j} \}b_{j}\), 给出\(a_{1} 到 a_{n}\) : 求\(b_{l} 到 b_{r}\)在\(1e9+ ...

  7. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  8. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

  9. 【loj2461】【2018集训队互测Day 1】完美的队列

    #2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...

随机推荐

  1. 2017-2018-4 20155203《网络对抗技术》Exp3 免杀原理与实践

    1.基础问题回答 (1)杀软是如何检测出恶意代码的? 分析恶意程序的行为特征,分析其代码流将其性质归类于恶意代码 (2)免杀是做什么? 使恶意代码避免被查杀,也就是要掩盖恶意代码的特征 (3)免杀的基 ...

  2. CS100.1x Introduction to Big Data with Apache Spark

    CS100.1x简介 这门课主要讲数据科学,也就是data science以及怎么用Apache Spark去分析大数据. Course Software Setup 这门课主要介绍如何编写和调试Py ...

  3. Solr 后台查询实例 (工作备查)

    有时间再进行整理package xxx.service.impl; import java.util.HashMap; import java.util.Map; import java.util.M ...

  4. android 一些常用的功能方法代码块

    我们这些苦逼的程序员在工作中,每一个老板都希望我们都能把手头的工作做好的,而且是越快越好,那我们要怎么样才能快起来呢?对于开发中常用的代码块无限复做是我们工作中简省时间最有效的途径之一,而下面的这些代 ...

  5. 激活IntelliJ IDEA到2100年

    1.下载破解文件(破解版本2018.2,其他版本未尝试) http://idea.lanyus.com/jar/JetbrainsIdesCrack-4.2-release-sha1-3323d5d0 ...

  6. 用Micro:bit做交通信号灯

    交通信号灯项目在控制技术中,有点像"Hello world!" 是一个入门级的范例. 对于孩子来说,交通灯跟日常生活息息相关,他们都熟悉,充分知道需要做什么这是一个让孩子开始的好项 ...

  7. 关于go v1.11安装后出现不能正常运行测试程序的问题

    本人最近安装go1.11后出现上述问题,没有找到原因,可能之前安装过的旧的版本在windows下环境变量设置出现了问题,修改后仍然无效,后来删除所有安装版本,及go环境变量,重新下载1.10版本进行安 ...

  8. PAT甲题题解-1055. The World's Richest (25)-终于遇见一个排序的不水题

    题目简单,但解题的思路需要转换一下,按常规思路肯定超时,推荐~ 题意:给出n个人的姓名.年龄和拥有的钱,然后进行k次查询,输出年龄在[amin,amx]内的前m个最富有的人的信息.如果财富值相同就就先 ...

  9. 20135220谈愈敏Blog3_构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS 谈愈敏 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1 ...

  10. 《Linux内核分析》 第一节 计算机是如何工作的

    第一节 计算机是如何工作的 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...