洛谷题面传送门

一道很神的随机化。

首先由于我们要求向量点乘 \(\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] 向量内积(随机化)的更多相关文章

  1. P1224 [NOI2013]向量内积

    传送门 发现这个内积和矩乘有点像,考虑构造一个 $n$ 行 $m$ 列的矩阵 $A$,每一行都是一个题目给定的 $m$ 维向量 设 $B=AA^T$ ,其中 $A^T$ 为 $A$ 的转置矩阵,那么对 ...

  2. luogu P1224 [NOI2013]向量内积

    传送门 挺有意思的一道题 暴力60就是枚举每个向量暴力check,随机选向量就能多骗一些分 然后两个向量内积要模\(k\)为\(0\),那么如果全部不为\(0\)就不合法.先考虑\(k=2\),对于向 ...

  3. 【BZOJ-3243】向量内积 随机化 + 矩阵

    3243: [Noi2013]向量内积 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1249  Solved:  ...

  4. 【fake题解】[NOI2013]向量内积

    [fake题解][NOI2013]向量内积 做法1 大暴力.哪里不会T哪里. 做法2 所有数都%=k不影响结果.(废话 k的取值只有2和3,所以肯定是要分类讨论的.k=2肯定简单些啦. k=2 出现的 ...

  5. 洛谷 P2503 [HAOI2006]均分数据 随机化贪心

    洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...

  6. [Noi2013]向量内积

    来自FallDream的博客,未经允许,请勿转载,谢谢. 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: $\sum_{i=1 ...

  7. 洛谷P1224 向量内积

    什么毒瘤...... 题意:给定n个d维向量,定义向量a和b的内积为 求是否存在两个向量使得它们的内积为k的倍数,并给出任一种方案.k <= 3. 解:很容易想到一个暴力是n2d的.显然我们不能 ...

  8. UOJ#121. 【NOI2013】向量内积 随机化算法,矩阵

    原文链接www.cnblogs.com/zhouzhendong/UOJ121.html 前言 完蛋了我越来越菜了贺题都不会了. 题解 $O(n ^ 2 d) $ 暴力送 60 分. Bitset 优 ...

  9. BZOJ3243 NOI2013向量内积(随机化)

    考虑奇技淫巧. 首先是k=2.对向量维护一个前缀和,每次将当前向量与前缀和点乘.如果点乘结果不等于i-1&1,说明当前向量至少和之前的某个向量的数量积是2的倍数,暴力找就可以了.当然等于i-1 ...

随机推荐

  1. Python代码阅读(第21篇):将变量名称转换为蛇式命名风格

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现将变量名称转换为蛇式命名风格(snake case)的功能. 本篇阅读的代码片段来自于30-second ...

  2. 初学python-day6 for循环和流程控制(已更新循环做三角形图形!!)

    for循环 1.格式 for    变量    in   集合: 循环体 2.概述 当程序执行for循环,按顺序从集合中获取元素变量保存当前循环得到的值,再去执行循环体.当集合中数据都被取完,则此刻跳 ...

  3. RabbitMQ:从入门到搞定面试官

    安装 使用docker安装,注意要安装tag后缀为management的镜像(包含web管理插件),我这里使用的是rabbitmq:3.8-management 1. 拉取镜像 shell docke ...

  4. PyCharm中目录directory与包package的区别及相关import详解

    一.概念介绍 在介绍目录directory与包package的区别之前,先理解一个概念---模块 模块的定义:本质就是以.py结尾的python文件,模块的目的是为了其他程序进行引用. 目录(Dire ...

  5. Beta阶段第九次会议

    Beta阶段第九次会议 时间:2020.5.25 完成工作 姓名 完成工作 任务难度 完成度 ltx 1.发现小程序身份认证bug和新闻列表获取bug2.修改新增页面风格 轻 90% xyq 1.修改 ...

  6. iPhone SE切换颜色特效

    Apple 网站的特效, iPhone SE 共有黑.白.红三种颜色,在卷动页面的时候会逐步替换,看起来效果非常时尚,在此供上代码学习. <!DOCTYPE html> <html& ...

  7. SpringCloud微服务实战——搭建企业级开发框架(十):使用Nacos分布式配置中心

    随着业务的发展.微服务架构的升级,服务的数量.程序的配置日益增多(各种微服务.各种服务器地址.各种参数),传统的配置文件方式和数据库的方式已无法满足开发人员对配置管理的要求: 安全性:配置跟随源代码保 ...

  8. 检查是否是BST 牛客网 程序员面试金典 C++ java Python

    检查是否是BST 牛客网 程序员面试金典  C++ java Python 题目描述 请实现一个函数,检查一棵二叉树是否为二叉查找树. 给定树的根结点指针TreeNode* root,请返回一个boo ...

  9. 释放 cached 内存

    巡检服务器发现内存可用很少了 top 命令查看是没有占用大内存的进程,cached特别大,释放cached就可以了 可用内存= free + buffers + cached 以下方法可以释放cach ...

  10. Jenkins MultiJob

    前提:项目有十几个服务每次发版/更新服务需要一个个去编译 目的:希望能够建立一个任务一次构建可以批量编译很多服务,并且需要输入一个参数指定编译的分支 需要插件: MultiJob 安装插件 1.在Je ...