【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)
题目
描述
\(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的旅行(白)的更多相关文章
- 【纪中集训2019.3.23】Deadline
题意 描述 一个二分图\((A,B)\),每个点额外有一个颜色0或者1: 匹配时,只能相同颜色的点匹配: 给出\(A\)中的颜色,问如何分配\(B\)种的颜色使得\((A,B)\)的最大匹配最小: 范 ...
- 【纪中集训2019.3.12】Mas的仙人掌
题意: 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...
- 【纪中集训2019.3.23】IOer
题目 描述 你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限: 第\(i\)天可以刷的题目的种类是\(ui+v\): 两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同 ...
- 【纪中集训2019.3.11】Cubelia
题目: 描述 给出长度为\(n\)的数组\(a\)和\(q\)个询问\(l,r\). 求区间\([l,r]\)的所有子区间的前缀和的最大值之和: 范围: $n \le 2 \times 10^5 , ...
- 【纪中集训2019.3.13】fft
题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...
- 【纪中集训2019.3.12】Z的礼物
题意 已知\(a_{i} = \sum_{j=1}^{i} \{^{i} _{j} \}b_{j}\), 给出\(a_{1} 到 a_{n}\) : 求\(b_{l} 到 b_{r}\)在\(1e9+ ...
- 「中山纪中集训省选组D1T1」最大收益 贪心
题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...
- 【2018集训队互测】【XSY3372】取石子
题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...
- 【loj2461】【2018集训队互测Day 1】完美的队列
#2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...
随机推荐
- Java基础—异常
一.概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 异常体 Throwable:所有异常类的超类 Error:它表示不希望被程序捕获或者是程序无法处理的错误 ...
- 20155327 实验四 Android程序设计
20155327 实验四 Android程序设计 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 步骤: 将布局文件activity_ma ...
- springboot redis 监听过期key值事件
redis 中的key值过期后,触发通知事件 1.创建springboot工程,创建监听类 maven配置 <dependencies> <dependency> <gr ...
- MFC如何为程序添加图标
1.找几幅Ico格式的图片,可以在电脑中查找.ico一般都会找到.然后将ico文件放在工程目录下的res文件夹下. 2.点击菜单栏->编辑->添加资源->导入,选择res文件夹中将要 ...
- [Deep-Learning-with-Python]基于Keras的房价预测
预测房价:回归问题 回归问题预测结果为连续值,而不是离散的类别. 波士顿房价数据集 通过20世纪70年代波士顿郊区房价数据集,预测平均房价:数据集的特征包括犯罪率.税率等信息.数据集只有506条记录, ...
- Docker GitHub 网站中 Readme.md 以技术者的角度翻译
Docker 是一个开源的轻量级容器项目,用于让你的应用在它上面打包.集装和运行.Docker 运行的环境既包含未知硬件也包含未知操作系统.这句话的意思是它可以运行在任何地方,小到你的笔记本大到一个大 ...
- 浅谈 iOS 中的 Activity Indicator
Activity Indicator 是iOS开发中必不可少的一个视图.本文就简单地总结一下这个Activity Indicator 的使用方法. 默认 Activity Indicator 以下的函 ...
- anaconda安装opencv3
opencv是C和C++语言编写的,很多教程都是基于C++语言进行学习的,可是机器学习最多的库是python写的,所以还是学学python怎么安装opencv3, 面向学习的大都是使用了anacond ...
- 浅析java构造函数前的访问限定符问题
曾经一直有个问题困扰着我,我一直以为构造函数前面不能加任何东西,但偶然间看到了一本书上写的代码中,构造函数前加了public限定符,心里很是疑惑,构造函数前加毛访问限定符啊??! 在网上查了很多资料 ...
- 《HTTP权威指南》读书笔记:缓存
缓存的定义 Web缓存是可以自动保存常见文档副本的HTTP设备(包括浏览器?) 缓存的作用 减少冗余数据传输 缓解带宽瓶颈(很多网络为本地网络客户端提供的带宽比为远程服务器提供的带宽要宽) 缓解瞬时拥 ...