zoukankan      html  css  js  c++  java
  • [NOI2013] 向量内积

    注意:本文中的一切数字即数字运算均在(k)的同余系内(即(xleftarrow xmod k)),*只用于表示向量点积。

    暴力的算法是,从小到大枚举向量(A[x]),判定(A[1])(A[x-1])中是否存在与(A[x])点积为(0)的向量:若存在,暴力搜索答案;否则枚举下一个向量(A[x+1])

    算法的瓶颈在于“判定”这一部分,即计算(sum_{y<x}sigma(A[y]*A[x] ot=0))是否等于(x-1)[1]

    (k=2)时因为(sigma(w ot=0)=w),所以只需判定下式值为(x-1)即可

    [sum_{y<x}A[x]*A[y]=A[x]*sum_{y<x}A[y] ]

    然后是(k=3)的情况,这时因为(sigma(w ot=0)=w^2),所以只需判定下式值为(x-1)即可

    [sum_{y<x}(A[x]*A[y])^2 =sum_{y<x}(sum_iA[x,i]A[y,i])^2=sum_{y<x}sum_{i}A[x,i]A[y,i]sum_jA[x,j]A[y,j]\ =sum_isum_jA[x,i]A[x,j]sum_{y<x}A[y,i]A[y,j] ]

    两种情况的式子都化简到了能快速处理的形式。

    #include <bits/stdc++.h>
    using namespace std;
    
    int n,m,K,id[100001];
    int a[100001][101],b[101],c[101][101];
    
    int solve(int x) {
    	int tot=0;
    	if(K==2) 
    		for(int i=1; i<=m; b[i]^=a[x][i],i++) tot^=b[i]&a[x][i];
    	else 
    		for(int i=1; i<=m; ++i) 
    		for(int j=1; j<=m; c[i][j]+=a[x][i]*a[x][j],++j) 
    			tot+=c[i][j]*a[x][i]*a[x][j];
    	return tot%K;
    }
    bool check(int x,int y) {
    	int tot=0;
    	for(int i=1; i<=m; ++i) tot+=a[x][i]*a[y][i];
    	return tot%K==0;
    }
    
    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) id[i]=i;
    	for(int OVO=5; OVO--; ) {
    		random_shuffle(id+1,id+n+1);
    		K==2?memset(b,0,sizeof b):memset(c,0,sizeof b);
    		for(int i=1; i<=n; ++i) if(solve(id[i])!=(i-1)%K) 
    		for(int j=1; j<i; ++j) if(check(id[i],id[j])) {
    			if(id[i]>id[j]) swap(id[i],id[j]);
    			printf("%d %d
    ",id[i],id[j]);
    			return 0;
    		}
    	}
    	puts("-1 -1");
    	return 0;
    }
    

    1. 这一定正确吗?拿衣服 当然不。注意此时的式子实际上是(sumdotsequiv x-1pmod k)这样,所以这样判断是存在错判概率的。一个解决办法是把向量顺序打乱多做几次。 ↩︎

  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/nosta/p/10875713.html
Copyright © 2011-2022 走看看