1. 程式人生 > >【NOI2013】向量內積

【NOI2013】向量內積

一開始用bitset水了50分。。。但想一想那個年代stl還沒有解禁啊。。。
然後不會,棄療,看題解,竟然是矩陣!
生成行向量n^2判斷矩陣相等太妙了
判斷時哪裡不相等就把它拎出來暴力判
k=3時平方就與k=2時基本相同了
自己寫..wa…然後抄程式碼….

#include<bits/stdc++.h>
#define rep(i,n) for(int i=1;i<=(n);i++)
using namespace std;
const int N=200005;
void sc(int& x){
    x=0;char c=getchar();
    for(;c>'9'
||c<'0';c=getchar()); for(;c<='9' && c>='0';c=getchar())x=10*x+c-'0'; } int n,d,k,C[N],B[N],AA[N],A[N][110],lim,cnt=0,id[110][110]; void upd(int& x,int y){x+=y;if(x>=k)x-=k;while(x<0)x+=k;} void solve2(){ rep(i,n)rep(j,d)upd(B[j],A[i][j]); rep(i,n)rep(j,d)upd(C[i],B[j]*A[i][j]); rep(i,n)upd(C[i],-AA[i]);lim=(n-1
)%k; } void solve3(){ rep(i,d)rep(j,d)id[i][j]=++cnt; rep(i,n)rep(j,d)rep(p,d)upd(B[id[j][p]],A[i][j]*A[i][p]); rep(i,n)rep(j,d)rep(p,d)upd(C[i],B[id[j][p]]*A[i][j]*A[i][p]); rep(i,n)upd(C[i],-AA[i]*AA[i]);lim=(n-1)%k; } bitset<205> a[N],tmp; void solve4(){ rep(i,n){int x; rep(j,d){ sc(x);a[i][j]=x%k; } rep(j,i-1
){ tmp=a[i]&a[j]; if(tmp.count()%k==0){ printf("%d %d",j,i);return; } } } printf("-1 -1\n"); } int main(){//freopen("in.in","r",stdin); sc(n),sc(d),sc(k); if(n<=1000 && k==2){solve4();return 0;} rep(i,n)rep(j,d)sc(A[i][j]),A[i][j]%=k,AA[i]+=A[i][j]*A[i][j]%k; if(k==2)solve2();else solve3(); rep(i,n)if(C[i]!=lim){ rep(j,n)if(j!=i){ int ans=0; rep(p,d)ans+=A[i][p]*A[j][p]; if(ans%k==0){if(j<i)printf("%d %d\n",j,i);else printf("%d %d\n",i,j);return 0;} } } printf("-1 -1\n"); }