洛谷 P1224 - [NOI2013] 向量内积(随机化)
一道很神的随机化。
首先由于我们要求向量点乘 \(\bmod k\) 的值,因此我们可以将所有 \(x_{i,j}\) 都模上 \(k\),显然该操作不影响结果正确性。
注意到这里的 \(d\) 与 \(n\) 不同阶,这也就暗示我们要找到一个复杂度重心偏向 \(d\) 的算法,首先考虑 \(k=2\) 的情形,我们考虑依次枚举所有向量并维护它们的前缀和 \(\vec{S}\),对于每个向量 \(\vec{x_i}\) 我们求出 \(\vec{S}·\vec{x_i}\bmod k\) 的值——显然如果对于所有 \(j<i\),\(\vec{x_i}·\vec{x_j}\) 都不是 \(k\) 的倍数,那么应有 \(\vec{S}·\vec{x_i}\equiv i-1\pmod{k}\),因此如果我们发现上式不成立那么必然 \(\exists j<i,\vec{x_i}·\vec{x_j}\bmod k=0\),于是我们再 \(\mathcal O(nd)\) 地 check 一遍即可。
接下来考虑 \(k=3\) 的情形,由于任意两个向量 \(\vec{u}·\vec{v}\bmod 3\) 可能得到 \(0,1,2\) 三种可能,因此如果 \(\vec{S}·\vec{x_i}\not\equiv i-1\pmod{k}\) 并不能得出 \(\exists j<i,\vec{x_i}·\vec{x_j}\bmod k=0\),上述 solution 也就不能简简单单地推广到 \(k=3\) 的情形,不过发现 \(1,2\) 平方一下都能得到 \(1\),因此考虑求出 \(\sum\limits_{j=1}^{i-1}(\vec{x_j}·\vec{x_i})^2\)——该式子可以写成 \(\sum\limits_{j=1}^{i-1}\vec{x_j}·\vec{x_i}^{T}·\vec{x_j}^{T}·\vec{x_i}=\sum\limits_{j=1}^{i-1}\vec{x_j}·\vec{x_j}^{T}·\vec{x_i}^{T}·\vec{x_i}\),维护矩阵 \(A=\sum\limits_{j=1}^{i-1}\vec{x_j}·\vec{x_j}^T\) 即可 \(\mathcal O(d^2)\) 求出上述值,这部分复杂度 \(\mathcal O(nd^2)\)。
但是很显然在上述过程中我们用的只是必要条件,也就是说如果我们没有找到某个 \(i\) 满足 \(\vec{S}·\vec{x_i}\not\equiv i-1\pmod{k}\),并不意味着不存在符合条件的两个向量 \(i,j\),反例随便举,比如:
3 2 2
1 1
1 0
0 0
不过注意到在单次过程中,我们找不到符合条件的两个向量 \(\vec{x_i},\vec{x_j}\) 的概率是很小的,因此考虑随机化,每次把向量集合 random_shuffle 一下,然后重复上面的步骤即可,这样即可通过此题。
const int MAXN=1e5;
const int MAXM=100;
int n,m,k,a[MAXN+5][MAXM+5];
bool check(int x,int y){
int sum=0;
for(int i=1;i<=m;i++) sum+=a[x][i]*a[y][i];
return sum%k==0;
}
int b[MAXM+5],c[MAXM+5][MAXM+5],p[MAXN+5];
int work(int x){
if(k==2){
int sum=0;
for(int i=1;i<=m;i++) sum+=b[i]*a[x][i];
for(int i=1;i<=m;i++) b[i]^=a[x][i];
return sum%k;
} else {
int sum=0;
for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) sum+=c[i][j]*a[x][i]*a[x][j];
for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) c[i][j]=(c[i][j]+a[x][i]*a[x][j])%k;
return sum%k;
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);a[i][j]%=k;
}
for(int i=1;i<=n;i++) p[i]=i;
for(int t=1;t<=8;t++){
memset(b,0,sizeof(b));memset(c,0,sizeof(c));
random_shuffle(p+1,p+n+1);
for(int i=1;i<=n;i++) if(work(p[i])!=(i-1)%k){
for(int j=1;j<i;j++) if(check(p[i],p[j])){
printf("%d %d\n",min(p[i],p[j]),max(p[i],p[j]));return 0;
} assert(0);
}
} puts("-1 -1");
return 0;
}
洛谷 P1224 - [NOI2013] 向量内积(随机化)的更多相关文章
- P1224 [NOI2013]向量内积
传送门 发现这个内积和矩乘有点像,考虑构造一个 $n$ 行 $m$ 列的矩阵 $A$,每一行都是一个题目给定的 $m$ 维向量 设 $B=AA^T$ ,其中 $A^T$ 为 $A$ 的转置矩阵,那么对 ...
- luogu P1224 [NOI2013]向量内积
传送门 挺有意思的一道题 暴力60就是枚举每个向量暴力check,随机选向量就能多骗一些分 然后两个向量内积要模\(k\)为\(0\),那么如果全部不为\(0\)就不合法.先考虑\(k=2\),对于向 ...
- 【BZOJ-3243】向量内积 随机化 + 矩阵
3243: [Noi2013]向量内积 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1249 Solved: ...
- 【fake题解】[NOI2013]向量内积
[fake题解][NOI2013]向量内积 做法1 大暴力.哪里不会T哪里. 做法2 所有数都%=k不影响结果.(废话 k的取值只有2和3,所以肯定是要分类讨论的.k=2肯定简单些啦. k=2 出现的 ...
- 洛谷 P2503 [HAOI2006]均分数据 随机化贪心
洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...
- [Noi2013]向量内积
来自FallDream的博客,未经允许,请勿转载,谢谢. 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: $\sum_{i=1 ...
- 洛谷P1224 向量内积
什么毒瘤...... 题意:给定n个d维向量,定义向量a和b的内积为 求是否存在两个向量使得它们的内积为k的倍数,并给出任一种方案.k <= 3. 解:很容易想到一个暴力是n2d的.显然我们不能 ...
- UOJ#121. 【NOI2013】向量内积 随机化算法,矩阵
原文链接www.cnblogs.com/zhouzhendong/UOJ121.html 前言 完蛋了我越来越菜了贺题都不会了. 题解 $O(n ^ 2 d) $ 暴力送 60 分. Bitset 优 ...
- BZOJ3243 NOI2013向量内积(随机化)
考虑奇技淫巧. 首先是k=2.对向量维护一个前缀和,每次将当前向量与前缀和点乘.如果点乘结果不等于i-1&1,说明当前向量至少和之前的某个向量的数量积是2的倍数,暴力找就可以了.当然等于i-1 ...
随机推荐
- 【UE4 C++】 UnrealPak 与 Pak 的制作、挂载、加载
简介 通过 UnrealPak,可以将资源打包成 Pak 文件 Pak文件是UE4游戏生成的数据包文件. Pak 之前一般先有 Cooked 步骤,将资源烘焙为对应平台支持的资源 一般打包后的项目使用 ...
- linux安装后ping不通局域网其他主机的解决方式
安装了linux后尝试进行机器间的相互通讯,发现自己虚拟机并不能查看ip地址,也不能够ping通任何一台局域网内的主机 上网查了一下发现是网卡并没有打开,需要进行如下配置 查看ls 一下/etc/sy ...
- Des加密解密(公共方法)
1 public class Des 2 { 3 public static string Encrypt(string message, string key) 4 { 5 DES des = ne ...
- js实现日期格式化封装-八种格式
封装一个momentTime.js文件,包含8种格式. 需要传两个参数: 时间戳:stamp 格式化的类型:type, 日期补零的方法用到es6语法中的padStart(length,'字符'): 第 ...
- [源码解析] PyTorch 如何使用GPU
[源码解析] PyTorch 如何使用GPU 目录 [源码解析] PyTorch 如何使用GPU 0x00 摘要 0x01 问题 0x02 移动模型到GPU 2.1 cuda 操作 2.2 Modul ...
- 第一篇:《Kubernetes 入门介绍》
前言:本文是一篇 kubernetes(下文用 k8s 代替)的入门文章,将会涉及 k8s 的技术历史背景.架构.集群搭建.一个 Redis 的例子,以及如何使用 operator-sdk 开发 op ...
- Java学到什么程度能找到一份还不错的工作
我的读者里有很多 Java 新人,新人是指正在学 Java 的.以及工作时间不长的年轻人,他们经常问我一个问题: Java 学到什么程度才能找到一份还不错的工作? 今天我就从我自己面试新人的角度来回答 ...
- Fiddler抓包工具简介:(一)认识Fiddler
认识Fiddler Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出"Fiddler的数据(指coo ...
- MySQL之DDL数据定义语言:库、表的管理
库的管理 常用命令 #创建库 create database if not exists 库名 [ character set 字符集名]; create database if not exists ...
- 编译静态库的方式使用spdlog和fmt
前言 spdlog++库,而且支持header only方式,但header only的使用方式会造成编译时长增加,所以这里简单描述一下,其编译静态库的方式. 又因为spdlog还依赖另一个开源库fm ...