[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 描述 在一个平面上,如果有两个点( ...
随机推荐
- FTP上传 -首先上传文件到的那台电脑得安装ftp
/*↓↓↓↓ add upload ftp file 2014-03-16*/ /*↓↓↓↓ add 2014-03-16 ftp upload file*/ var $ftpse ...
- ESlint中console.log报错问题
ESlint中console.log报错问题 由于ESlint规范化,导致console.log的使用也会报错,下面是设置允许console.log控制台输出 描述:打开 package.json 文 ...
- IDEA提高开发效率的7个插件
IDEA提高开发效率的7个插件 1. 多行编辑 先来体验一下从xml文件拷贝字段新建实体对象 一般我们为了新建多表连接后映射的 ResultMap ,耗费不少时间,那么我们就来试一试这个多行编辑 表字 ...
- 还不会K8S吗?先从kubeadm开始吧
目录 1. 准备工作 1.1 机器准备 1.2 系统配置 1.2.1 主机名及域名解析 1.2.2 免密登录 1.2.3 配置yum源 1.2.4 安装必要依赖包 1.2.5 关闭防火墙.SELinu ...
- JavaScript数组常见用法
最近做一个项目中做一个竞猜游戏界面,游戏规则和彩票是一样的.在实现“机选一注”,“机选五注”的时候遇到数组的一些操作,例如产生['01', '02' ... '35']这样的数组,随机抽取不重复的元素 ...
- shiro的ssm集成和简单的开发尝试
配置web.xml <!-- 配置shiro的集成开始 --> <filter> <filter-name>shiroFilter</filter-name& ...
- corosync+pacemaker实现httpd高可用
corosync+pacemaker 官方网址 https://clusterlabs.org/ 一.开源高可用了解 OPEN SOURCE HIGH AVAILABILITY CLUSTER STA ...
- 剑指Offer之链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路:首先计算出链表的长度,再计算出倒数第k个是正数第几个,找到该结点即可. public ListNode FindKthToTail(Li ...
- C#中方法的静态和非静态
在代码中,给方法加上static就成为了一个静态的方法,然而静态方法是隶属于类的,由类名点出来! 不给方法加static就是一个非静态方法,非静态的方法,是隶属于对象的,需要把类实例化之后,用对象名去 ...
- [JavaWeb基础] 028.CSS简介和基础语法
css 概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现 ...