NOI2015 UOJ122 向量内积

神题......

还是大神讲得比较清晰~orz

http://dffxtz.logdown.com/posts/197950-noi2013-vector-inner-product

启发题:poj3318

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj
#include<ctime>

using namespace std;

typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP;

#define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define re(i,a,b)  for(i=a;i<=b;i++)
#define red(i,a,b) for(i=a;i>=b;i--)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k))

template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}

const DB EPS=1e-9;
inline int sgn(DB x){if(abs(x)<EPS)return 0;return(x>0)?1:-1;}
const DB Pi=acos(-1.0);

inline int gint()
  {
        int res=0;bool neg=0;char z;
        for(z=getchar();z!=EOF && z!=‘-‘ && !isdigit(z);z=getchar());
        if(z==EOF)return 0;
        if(z==‘-‘){neg=1;z=getchar();}
        for(;z!=EOF && isdigit(z);res=res*10+z-‘0‘,z=getchar());
        return (neg)?-res:res;
    }
inline LL gll()
  {
      LL res=0;bool neg=0;char z;
        for(z=getchar();z!=EOF && z!=‘-‘ && !isdigit(z);z=getchar());
        if(z==EOF)return 0;
        if(z==‘-‘){neg=1;z=getchar();}
        for(;z!=EOF && isdigit(z);res=res*10+z-‘0‘,z=getchar());
        return (neg)?-res:res;
    }

const int maxN=100000;
const int maxDD=100;

int N,DD,D,K;
int v[maxN+100][maxDD+10];

inline int A1(int i,int j)
  {
      if(K==3)
        {
            int t1=(j+DD-1)/DD,t2=j-(t1-1)*DD;
            return v[i][t1]*v[i][t2];
        }
      return v[i][j];
  }
inline int A2(int i,int j){return A1(j,i);}

int F[maxN+100],X[maxN+100],GX[maxN+100],FX[maxN+100],A2X[maxN+100],A1A2X[maxN+100],TX[maxN+100];
inline int work()
  {
      int i,j,k,Case;
      if(1LL*N*D<10000000LL) Case=10; else Case=2;
      while(Case--)
        {
            re(i,1,N)X[i]=rand()%2;

            mmst(GX,0);
            re(i,1,N)GX[1]+=X[i];
            GX[1]%=K;
            re(i,2,N)GX[i]=GX[1];

            re(i,1,N)FX[i]=F[i]*X[i];

            mmst(A2X,0);
            re(i,1,D)re(j,1,N)A2X[i]+=A2(i,j)*X[j];

            mmst(A1A2X,0);
            re(i,1,N)re(j,1,D)A1A2X[i]+=A1(i,j)*A2X[j];
            re(i,1,N)A1A2X[i]%=K;

            re(i,1,N)
              {
                  TX[i]=GX[i]-FX[i]-A1A2X[i];
                  TX[i]=(TX[i]%K+K)%K;
                  if(TX[i]==1)
                    {
                        re(j,1,N)if(j!=i)
                          {
                              int res=0;
                              re(k,1,DD)res+=v[i][k]*v[j][k];
                              if(res%K==0){PF("%d %d\n",min(i,j),max(i,j));return 1;}
                          }
                    }
              }
        }
      return 0;
  }

int main()
  {
      freopen("meow.in","r",stdin);
      freopen("meow.out","w",stdout);
      srand(time(0));
      int i,j;
      N=gint();D=gint();K=gint();
      re(i,1,N)re(j,1,D)v[i][j]=gint()%K;
      DD=D;if(K==3)D=D*D;
      re(i,1,N)
        {
            F[i]=0;
            re(j,1,D) F[i]+=A1(i,j)*A2(j,i);
            F[i]%=K;F[i]^=1;
        }
      if(!work())PF("-1 -1\n");
      return 0;
  }

时间: 2024-10-23 10:10:59

NOI2015 UOJ122 向量内积的相关文章

[BZOJ]3243 向量内积(Noi2016)

小C做了之后很有感觉的题目之一,但因为姿势不对调了很久. Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: 现有 n 个d 维向量x1,...,xn ,小喵喵想知道是否存在两个向量的内积为k的倍数.请帮助她解决这个问题. Input 第一行包含3个正整数n,d,k,分别表示向量的个数,维数以及待检测的倍数.接下来n行每行有d个非负整数,其中第i行的第j个整数表示向量xi的第j维权值xi,j. N<=1

3243: [Noi2013]向量内积 - BZOJ

Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: 现有 n 个d 维向量x1,...,xn ,小喵喵想知道是否存在两个向量的内积为k的倍数.请帮助她解决这个问题Input 第一行包含3个正整数n,d,k,分别表示向量的个数,维数以及待检测的倍数.接下来n行每行有d个非负整数,其中第i行的第j个整数表示向量xi的第j维权值xi,j.Output 包含两个整数,用空格隔开.如果存在两个向量xp,xq的内积

编程题-最小向量内积-(1)

有两个向量v1=(x1,x2,...,xn)和v2=(y1,y2,...,yn),允许任意交换v1和v2各自的分量的顺序,计算v1和v2的内积x1y1+x2y2+...+xnyn的最小值 样例: 输入: n=3 v1=(1,3,?5) v2=(?2,4,1) 输出: -25 ( 令v1=(?5,1,3),v2=(4,1,?2) ) 首先我第一感觉就是,要保证最小, 1.如果在有正有负的情况下,那么有最大的正数乘以最小的负数, 2.如果都是正数,用最大的正数乘以最小的正数, 3.如果都是负数,用最

[Noi2013]向量内积

来自FallDream的博客,未经允许,请勿转载,谢谢. 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: 现有 n 个d 维向量x1,...,xn ,小喵喵想知道是否存在两个向量的内积为k的倍数.请帮助她解决这个问题 k=2时 n<=20000 d<=100  k=3时n<=1000,d<=100 或者n<=100000 d<=30 把两个向量内积看作矩阵一个1*d的矩阵和d*1的矩阵相乘 那么k

向量内积&amp;外积

一.向量的内积 1.1向量内积的定义 概括地说,向量的内积(点乘/点积/数量积)就是对两个向量执行点乘运算,即对这两个向量对应位一一相乘之后求和的操作,如下所示,对于向量a和向量b:                  a和b的点积公式为: 这里要求一维向量a和向量b的行列数相同.注意:点乘的结果是一个标量(数量而不是向量). 定义:两个向量a与b的内积为 a·b = |a||b|cos∠(a, b),特别地,0·a =a·0 = 0:若a,b是非零向量,则a与b正交的充要条件是a·b = 0.

BZOJ3243 [Noi2013]向量内积/UOJ121

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: 现有 n 个d 维向量x1,...,xn ,小喵喵想知道是否存在两个向量的内积为k的倍数.请帮助她解决这个问题

【uoj121】 NOI2013—向量内积

http://uoj.ac/problem/121 (题目链接) 题意 给出${n}$个${d}$维向量,问是否有两个不同的向量的内积是${k}$的倍数. Solution 又卡了一上午常数,我弃了T_T. 右转题解→_→:llg 代码 // uoj121 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #inc

向量内积的推导

基本式 几何 對稱性: . 線性函數:設 .固定  時, 而且 同樣道理,固定  時,

向量的内积和外积

向量的内积(点乘) 定义 概括地说,向量的内积(点乘/数量积).对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,如下所示,对于向量a和向量b:   a和b的点积公式为: 这里要求一维向量a和向量b的行列数相同.注意:点乘的结果是一个标量(数量而不是向量) 定义:两个向量a与b的内积为 a·b = |a||b|cos∠(a, b),特别地,0·a =a·0 = 0:若a,b是非零向量,则a与b****正交的充要条件是a·b = 0. 向量内积的性质: a^2 ≥ 0:当a^2