题目

  点这里看题目。

分析

  我们不难想到,对于系数进行一下的拆分:

\[\begin{aligned}
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}\)的奇偶性。

  怎么求这个东西呢?我们可以想到用矩阵乘法。

  初始矩阵就是邻接矩阵:

\[T_{i,j}=
\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\)实际上是:

\[ \boldsymbol v = \{1,0,0,...\}\\
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]魔法值的更多相关文章

  1. [NOI Online #3 提高组] 魔法值

    现在只会\(O(qn^3log)\)的\(40pts\)做法,鸽了. 反正就是预处理之后,去掉一个\(n\). 我预处理了,没去\(n\),hhhh,成功减少了一半的常数.

  2. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  3. NOI 动态规划题集

    noi 1996 登山 noi 8780 拦截导弹 noi 4977 怪盗基德的滑翔翼 noi 6045 开餐馆 noi 2718 移动路线 noi 2728 摘花生 noi 2985 数字组合 no ...

  4. noi 6047 分蛋糕

    题目链接:http://noi.openjudge.cn/ch0405/6047/ 和Uva1629很类似,不过,可能用记忆化难写一点,状态初始化懒得搞了.就用循环好了. 状态描叙也可以修改,那个题目 ...

  5. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  6. NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树

    抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec  Memory Limit: ...

  7. noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35

    T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...

  8. NOI WC2016滚粗记

    Day-4 报到日,今年居然没有发包QAQ,中午到的,志愿者很热情,食堂吃不了(也有可能是吃不惯),空调打不热,有拖线板(好评),有wifi覆盖(虽然听说连上要看脸)(反正我是没连过,用的自己的流量) ...

  9. NOI题库刷题日志 (贪心篇题解)

    这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制:  1000ms  内存限制:  65536kB 描述 在一个平面上,如果有两个点( ...

随机推荐

  1. (STL初步)不定长数组:vector

    STL是指C++的标准模板库.(存储着一些常用的算法和容器) vector是一个不定长数组.它把一些常用的操作”封装“在vector类型内部. 例如,a是一个vector.1对元素的操作有,可以用a. ...

  2. 解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)

    一.问题 有时候我们登录Mysql输入密码的时候,会出现这种情况 mysql -u root -p Enter Password > '密码' 错误:ERROR 1045 (28000): Ac ...

  3. js解析MarkDown语法

    1.问题描述: 我们使用MarkDown编辑器之后,比如我们写的MarkDown的语法是:  # 一级标题  ## 二级标题  ### 三级标题 这种语法我们最终要转换成HTML的格式最终要存入数据库 ...

  4. java方式实现选择排序

    一.基本思想 每一趟找到未排序序列的最小(大)值,把它存放在已排序序列末尾,直到把所有的数据排序完,即是第k趟找到剩余未排序数据的最小(大)值,然后把这个最小(大)值存放在数组的第k(k=1,2... ...

  5. 北醒激光模块TFmini——STM32驱动程序(STM32F103C8T6)

    背景:该激光模块属于精度比较高的激光测距模块,使用方便. 代码地址:https://github.com/W-yt/YuTian_Pro/tree/master/TFMini_Driver 平台: 硬 ...

  6. RabbitMQ 高级应用

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 本文RabbitMQ版本为rabbitmq-server-3.7.17,erlang为erlang-22.0.7.请各位去官网查看版本匹配和下载 ...

  7. GNS3--cisco路由器NAT配置

    一.基础 Cisco路由器配置中NAT的主要命令: 静态NAT: 1.指定NAT内部接口 在内网相应接口的接口配置模式下执行:ip nat inside 2.指定NAT外部接口 在外网相应接口的接口配 ...

  8. data类型的url

      所谓"data"类型的Url格式,是在RFC2397中 提出的,目的对于一些"小"的数据,可以在网页中直接嵌入,而不是从外部文件载入.例如对于img这个Ta ...

  9. Rocket - debug - TLDebugModuleInner - Abstract Command State Machine

    https://mp.weixin.qq.com/s/RcXI8uEHvZHGCvX3DoVR4Q 简单介绍TLDebugModuleInner中处理抽象命令时的状态机. 1. CtrlState 定 ...

  10. 如何提交本地代码到git仓库

    首先要先注册一个自己的GitHub账号,注册网址:https://github.com/join 有了自己的账号以后,就可以进行登录,开始创建一个新的项目 创建一个新的项目,填写项目名称,描述 我是和 ...