BZOJ3243 [Noi2013]向量内积 【乱搞】
题目链接
题解
模数只有\(2\)或\(3\),可以大力讨论
如果模数为\(2\),乘积结果只有\(1\)或\(0\)
如果一个向量和前面所有向量乘积都为\(1\),那么其和前面向量前缀和的乘积就唯一确定
我们维护向量前缀和,第一个乘积情况不符的向量一定是答案,然后再枚举另一个向量即
\(O(nd)\)
如果模数为\(3\),乘积如果不为\(0\),还可以为\(1\)或\(2\),我们讨论的方法就不适用了
其实还是可以的
\]
我们只要维护平方和即可
如何维护平方和?
\]
就相当于原来的\(d\)维向量变成了\(d^2\)维,\(O(nd^2)\)也是可以过的
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 100005,maxm = 105,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int n,d,P;
int a[maxn][maxm],id[maxn];
int sum[maxm],Sum[maxm][maxm];
int mult(int* a,int* b){
int re = 0;
for (int i = 1; i <= d; i++) re = (re + a[i] * b[i] % P) % P;
return re;
}
int Mult(int a[],int b[][maxm]){
int re = 0;
for (int i = 1; i <= d; i++)
for (int j = 1; j <= d; j++)
re = (re + a[i] * a[j] * b[i][j] % P) % P;
return re;
}
void solve1(){
for (int i = 1; i <= d; i++) sum[i] = a[id[1]][i];
for (int i = 2; i <= n; i++){
int t = mult(a[id[i]],sum);
if (t != ((i - 1) & 1)){
for (int k = 1; k < i; k++)
if (!mult(a[id[k]],a[id[i]])){
printf("%d %d\n",min(id[k],id[i]),max(id[i],id[k]));
break;
}
return;
}
for (int j = 1; j <= d; j++) sum[j] = (sum[j] + a[id[i]][j]) % P;
}
printf("-1 -1\n");
}
void solve2(){
for (int i = 1; i <= d; i++)
for (int j = 1; j <= d; j++)
Sum[i][j] = a[id[1]][i] * a[id[1]][j] % P;
for (int i = 2; i <= n; i++){
int t = Mult(a[id[i]],Sum);
if (t != (i - 1) % P){
for (int k = 1; k < i; k++)
if (!mult(a[id[k]],a[id[i]])){
printf("%d %d\n",min(id[k],id[i]),max(id[i],id[k]));
break;
}
return;
}
for (int j = 1; j <= d; j++)
for (int k = 1; k <= d; k++)
Sum[j][k] = (Sum[j][k] + a[id[i]][j] * a[id[i]][k] % P) % P;
}
printf("-1 -1\n");
}
int main(){
srand(time(NULL));
n = read(); d = read(); P = read();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= d; j++)
a[i][j] = read() % P;
for (int i = 1; i <= n; i++) id[i] = i;
random_shuffle(id + 1,id + 1 + n);
if (P == 2) solve1();
else solve2();
return 0;
}
BZOJ3243 [Noi2013]向量内积 【乱搞】的更多相关文章
- BZOJ3243 NOI2013向量内积(随机化)
考虑奇技淫巧. 首先是k=2.对向量维护一个前缀和,每次将当前向量与前缀和点乘.如果点乘结果不等于i-1&1,说明当前向量至少和之前的某个向量的数量积是2的倍数,暴力找就可以了.当然等于i-1 ...
- 【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 出现的 ...
- [Noi2013]向量内积
来自FallDream的博客,未经允许,请勿转载,谢谢. 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: $\sum_{i=1 ...
- P1224 [NOI2013]向量内积
传送门 发现这个内积和矩乘有点像,考虑构造一个 $n$ 行 $m$ 列的矩阵 $A$,每一行都是一个题目给定的 $m$ 维向量 设 $B=AA^T$ ,其中 $A^T$ 为 $A$ 的转置矩阵,那么对 ...
- luogu P1224 [NOI2013]向量内积
传送门 挺有意思的一道题 暴力60就是枚举每个向量暴力check,随机选向量就能多骗一些分 然后两个向量内积要模\(k\)为\(0\),那么如果全部不为\(0\)就不合法.先考虑\(k=2\),对于向 ...
- BZOJ3243/UOJ121 [Noi2013]向量内积
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 3243: [Noi2013]向量内积 - BZOJ
Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: 现有 n 个d 维向量x1,...,xn ,小喵喵想知 ...
- 【uoj121】 NOI2013—向量内积
http://uoj.ac/problem/121 (题目链接) 题意 给出${n}$个${d}$维向量,问是否有两个不同的向量的内积是${k}$的倍数. Solution 又卡了一上午常数,我弃了T ...
随机推荐
- php访问url(get和post请求)
get请求 /* * php访问url路径,get请求 */ function curl_file_get_contents($durl){ // header传送格式 $headers = arra ...
- 第五课:PHP echo和print 语句
PHP echo 和 print 语句 PHP 是通过 print 和 echo 语句来动态输出 HTML 内容,虽然 print 和 echo 语句两者的功能几乎是完全一样,但是还是有一点差别的. ...
- 最简单的bootloader的编写
目标:写出bootloader的第一阶段代码和第二阶段代码,并测试. 最简单的bootloader的编写步骤: 1. 初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH2. 如 ...
- 机器学习基础之knn的简单例子
knn算法是人工智能的基本算法,类似于语言中的"hello world!",python中的机器学习核心模块:Scikit-Learn Scikit-learn(sklearn)模 ...
- C语言实例解析精粹学习笔记——35(报数游戏)
实例35: 设由n个人站成一圈,分别被编号1,2,3,4,……,n.第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从1开始报数,重复上述过程,直至所有人都从圈中退出. 实例解析: 用链 ...
- 幸运三角形 南阳acm491(dfs)
幸运三角形 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒 ...
- Python3爬虫(五)解析库的使用之XPath
Infi-chu: http://www.cnblogs.com/Infi-chu/ XPath: 全称是 XML Path Language,XML路径语言,它是一门在XML文档中和HTML文档中查 ...
- Sqoop的安装配置及使用
一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...
- Moodle的安装和登陆(使用Https)
之前使用默认的配置和安装,到中间检测组件是,总是提示 site no https.所以重新安装,用:https://localhost来登陆,结果不再提示,所以建议大家在使用时,还是用https来登 ...
- 在spring+beranate中多数据源中使用 ThreadLocal ,总结的原理 --费元星
设计模式 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问 ...