[NOI Online #3]魔法值
题目
点这里看题目。
分析
我们不难想到,对于系数进行一下的拆分:
f(u,j)&=\bigoplus_{(u,v)\in E} f(v,j-1)\\
&=\bigoplus_{(u,v)\in E}\bigoplus_{(v,w)\in E} f(w,j-2)\\
&...\\
&=\bigoplus_{x\in V} f(x,0)\times C^j_{u,x}
\end{aligned}
\]
其中,\(C^j_{u,x}\)表示恰好走\(j\)步时,从\(u\)到\(x\)的方案数。
根据异或的性质,我们实际上只会关心\(C^j_{u,x}\)的奇偶性。
怎么求这个东西呢?我们可以想到用矩阵乘法。
初始矩阵就是邻接矩阵:
\begin{cases}
1 & (i,j)\in E\\
0 & (i,j)\not \in E
\end{cases}
\]
现在对于一个询问\(a_i\),我们发现我们需要的系数实际上就是\(T^{a_i}\),这个东西可以用矩阵快速幂快速地求出来。
单纯地按照上面的方法,时间是\(O(n^3\sum\log_2a)\),不妙。
再仔细想一想,我们明明只需要从 1 出发的信息(只需要\(C^{a_i}_1\)),使用矩阵快速幂却多算了很多。
考虑\(C^{a_i}_1\)实际上是:
C^{a_i}_1=v\times T^{a_i}
\]
一个向量与矩阵相乘,时间是\(O(n^2)\)的。因此,我们可以将求出\(C^{a_i}\)的时间缩减到\(O(n^2)\),总时间\(O(n^2\sum \log_2a)\),可过。
实际操作中,我们需要预处理出\(T\)的倍增,避免每次重新计算,导致复杂度退化。
代码
#include <cstdio>
#include <cstring>
typedef long long LL;
const int MAXN = 105, MAXLOG = 40;
template<typename _T>
void read( _T &x )
{
x = 0;char s = getchar();int f = 1;
while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
x *= f;
}
template<typename _T>
void write( _T x )
{
if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
if( 9 < x ){ write( x / 10 ); }
putchar( x % 10 + '0' );
}
struct matrix
{
bool mat[MAXN][MAXN];
int n, m;
matrix() { n = m = 0, memset( mat, false, sizeof mat ); }
matrix( const int N, const int M ) { n = N, m = M, memset( mat, false, sizeof mat ); }
bool* operator [] ( const int indx ) { return mat[indx]; }
matrix operator * ( matrix b ) const
{
matrix ret = matrix( n, b.m );
for( int i = 1 ; i <= ret.n ; i ++ )
for( int k = 1 ; k <= m ; k ++ )
if( mat[i][k] )
for( int j = 1 ; j <= ret.m ; j ++ )
ret[i][j] ^= mat[i][k] & b[k][j];
return ret;
}
void operator *= ( matrix b ) { *this = *this * b; }
};
matrix B[MAXLOG], A;
LL f[MAXN];
int N, M, Q;
int main()
{
read( N ), read( M ), read( Q );
B[0] = matrix( N, N );
for( int i = 1 ; i <= N ; i ++ ) read( f[i] );
for( int i = 1, a, b ; i <= M ; i ++ )
read( a ), read( b ), B[0][a][b] = B[0][b][a] = 1;
for( int i = 1 ; i <= 32 ; i ++ ) B[i] = B[i - 1] * B[i - 1];
while( Q -- )
{
LL a; read( a );
A = matrix( 1, N ), A[1][1] = 1;
for( int i = 32 ; ~ i ; i -- )
if( a >> i & 1 )
A *= B[i];
LL ans = 0;
for( int i = 1 ; i <= N ; i ++ )
if( A[1][i] )
ans ^= f[i];
write( ans ), putchar( '\n' );
}
return 0;
}
[NOI Online #3]魔法值的更多相关文章
- [NOI Online #3 提高组] 魔法值
现在只会\(O(qn^3log)\)的\(40pts\)做法,鸽了. 反正就是预处理之后,去掉一个\(n\). 我预处理了,没去\(n\),hhhh,成功减少了一半的常数.
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- NOI 动态规划题集
noi 1996 登山 noi 8780 拦截导弹 noi 4977 怪盗基德的滑翔翼 noi 6045 开餐馆 noi 2718 移动路线 noi 2728 摘花生 noi 2985 数字组合 no ...
- noi 6047 分蛋糕
题目链接:http://noi.openjudge.cn/ch0405/6047/ 和Uva1629很类似,不过,可能用记忆化难写一点,状态初始化懒得搞了.就用循环好了. 状态描叙也可以修改,那个题目 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
- NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树
抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: ...
- noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35
T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...
- NOI WC2016滚粗记
Day-4 报到日,今年居然没有发包QAQ,中午到的,志愿者很热情,食堂吃不了(也有可能是吃不惯),空调打不热,有拖线板(好评),有wifi覆盖(虽然听说连上要看脸)(反正我是没连过,用的自己的流量) ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
随机推荐
- Jenkins-插件开发-BUG-Messages类编译报错
注意:下载Jenkins插件源码后报错Messages这个类怎么导包都报编译错误的问题! 今天从GitHub下载了Jenkins的一些插件源码,准备自己研究研究写个插件.但是发现每个源码中都存在一个编 ...
- java中的上下问解释以及ServletContext介绍使用
摘抄的:所谓上下文,它是用来存储系统的一些初始化信息,例如在jboss中通过配置文件指定了数据源,那么在jboss启动的时候就把这个文件的相关信息上下文中,于是在我们使用这个数据源的时候,就需要先获得 ...
- 15-2 insert语句介绍
create table TblClass ( tClassId ,) primary key, tClassName ) ) --向班级表中插入一条记录 --insert into 表名(列1,列2 ...
- vim的基础命令
:q 退出 :wq 保存并退出 :q! 不保存并退出 :w 保存 :w! 强行保存
- layui 数据表格最简单的点击事件
//定义点击事件 table.on('row(test)', function(obj){ console.log(obj.tr) //得到当前行元素对象 console.log(obj.data) ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据
上一篇文章(https://www.cnblogs.com/meowv/p/12943699.html)完成了项目的全局异常处理和日志记录. 在日志记录中使用的静态方法有人指出写法不是很优雅,遂优化一 ...
- RabbitMQ镜像集群搭建
RabbitMQ 官网 https://www.rabbitmq.com/ 小编使用的系统环境是CentOS7.4 系统 IP hostname CentOS7.4 1.1.1.1 hostname0 ...
- 获取数据库连接的方式 & Statement操作数据库的弊端
1.获取数据库连接的方式 TestConnection package com.aff.connection; import java.io.InputStream; import java.sql. ...
- windows文本转语音 通过java 调用python 生成exe可执行文件一条龙
我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图,请 ...
- 分布式 ID 的 9 种生成方式
为什么要用分布式ID? 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征? 什么是分布式ID? 拿MySQL数据库举个栗子: 在我们业务数据量不大的时候, ...