洛谷题面传送门

一道很神的随机化。

首先由于我们要求向量点乘 \(\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. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  2. px,dp sp是像素、尺寸、尺寸

    px:即像素,1px代表屏幕上一个物理的像素点:px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同,如下图所示(图片来自android developer guide, ...

  3. Java:ConcurrentHashMap类小记-3(JDK8)

    Java:ConcurrentHashMap类小记-3(JDK8) 结构说明 // 所有数据都存在table中, 只有当第一次插入时才会被加载,扩容时总是以2的倍数进行 transient volat ...

  4. Prometheus重新标记

    Prometheus重新标记 一.背景 二.简化的指标抓取的生命周期 1.配置参数详解 1.`action:`存在的值 1.替换标签值 2.删除指标 3.创建或删除标签 2.删除标签注意事项 3.几个 ...

  5. SpringCloud 2020.0.4 系列之服务降级的其他用法与熔断

    1. 概述 老话说的好:控制好自己的情绪,才能控制好自己的人生.冲动是魔鬼,冷静才最重要. 言归正传,之前聊了在 Feign 调用时,如何给整个 Feign接口类 增加降级策略. 今天我们来聊一下 H ...

  6. [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)

    前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...

  7. [luogu2973]driving out the piggies 驱逐猪猡【高斯消元+概率DP】

    看到题面的那一刻,我是绝望的ORZ 图论加概率期望加好像不沾边的高斯消元???我人直接傻掉 还没学过概率期望的我果断向题解屈服了(然后还是傻掉了两节课来找线性方程.. Description 奶牛们建 ...

  8. hdu 1506 Largest Rectangle in a Histogram(DP)

    题意: 有一个柱状图,有N条柱子.每一条柱子宽度都为1,长度为h1...hN. 在这N条柱子所构成的区域中找到一个最大面积,每平方米3块钱,问最多赚多少钱. 输入: 1<=N<=10000 ...

  9. linux 内核源代码情景分析——Intel X86 CPU 系列的寻址方式

    当我们说一个CPU是"16位"或"32"位时,指的是处理器中"算数逻辑单元"(ALU)的宽度.数据总线通常与ALU具有相同的宽度.当Inte ...

  10. Dubbo之负载均衡、并发控制、延迟暴露、连接控制

    1.并发控制 dubbo服务端和消费端都做了并发控制,分别在配置中有相应的对应配置: 服务端:executes服务提供者每服务每方法最大可并行执行请求数,控制并发数量:actives每服务消费者每服务 ...