题目

  点这里看题目。

分析

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

\[\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. uefi win10 Ubuntu 18的安装

    uefi win10 Ubuntu 18的安装 (Ubuntu折腾的第一天) 安装时的踩坑记录

  2. Spring 中基于 AOP 的 XML架构

    Spring 中基于 AOP 的 XML架构 为了使用 aop 命名空间标签,你需要导入 spring-aop j架构,如下所述: <?xml version="1.0" e ...

  3. 一文读懂Java注解

    什么是注解 Java官方文档上说,注解是元数据的一种形式,它提供不属于程序一部分的数据,注解对被注解的代码没有直接的影响. 准确上说,注解只不过是一种特殊的注释而已,如果没有解析它的代码,它可能连注释 ...

  4. 二、工具类ImageUtil——图片处理

    这个工具类完成的工作如下: 1.第一个static方法,完成图片格式的转换.统一转换成.jpg格式. package util; import java.awt.Toolkit; import jav ...

  5. Python - 常用的PyCharm的快捷键和使用场景介绍

    关于PyCharm的快捷键,由于数量众多,差不多有100个,相信几乎没有人会记住所有,每个人都会有自己顺手的几个,这里我将自己用着顺手,不别扭的快捷键分享出来,同时分享在哪里可以找到所有的快捷键. 一 ...

  6. 项目readme文件目录生成工具 treer

    生成目录的工具呢有tree和treer,但是tree不知道怎么忽略node_modules文件夹, 而treer就简单了,下面就是基本的命令了 其中-i是指忽略xxx, -e是指导出 安装 npm i ...

  7. html2canvas.js插件截图空白问题

    发现使用 html2canvas.js插件截图保存在前端很方便.学习过程中预计问题. 截图出现空白和截图不全. 问题原因: html2canvas.js插件截图是基于body标签的,如果body存在滚 ...

  8. [PHP自动化-进阶]002.CURL模拟登录带有验证码的网站

    引言:继前文<模拟登录并采集数据>,大家似乎看不过瘾,这会再出一发,模拟实现带验证码网站的登录. 这篇文章主要介绍了PHP使用CURL实现对带有验证码的网站进行模拟登录的方法,可以帮助读者 ...

  9. $工具, 属性, TAB点击切换

    $工具方法 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  10. Yii Framework 漏洞整理

    一 Yii Framework 2.0.9 - Cross Site ScriptingPublished # Exploit Title: Yii Framework 2.0.9 - Cross S ...