2022牛客国庆集训派对day6 C 递归构造 归纳构造
给出一个m 你需要构造出来m个m维向量 两两向量之间点乘为0 向量每一维只能是1或-1 保证m一定是2的幂次。
直接构造出来那么大的显然不太可能 发现不了什么比较好的规律。
考虑归纳构造。我们已知的是一个2维向量 即 1 1
1 -1 现在考虑通过这个东西生成四维的。
我先让他们整体向右完全复制 1 1 1 1 显然还满足条件
1 -1 1 -1
接下来让他们向下翻折且右下角的变为相反即完成构造。
考虑证明 设当前向量为a 向量平移变为 aa aa和bb显然满足条件
接下来构造和a相对的向量为 a-a a-a和aa显然满足条件 a-a和bb显然也满足条件 a-a和b-b显然也满足条件。
这样即完成了构造叫做归纳构造。
code
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define inf 100000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define rep(p,n,i) for(int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define pii pair<int,int>
#define mk make_pair
#define P 1000000007ll
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-10
#define sq sqrt
#define a(x) t[x].a
#define sum(x) t[x].sum
#define b(x) t[x].b
#define F first
#define S second
#define mod 998244353
using namespace std;
char *fs,*ft,buf[1<<15];
inline char gc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;
}
const int MAXN=100010;
int n;
int a[1050][1050];
inline void solve(int x)
{
if(x>n)return;
int m=x>>1;
rep(1,m,i)rep(m+1,x,j)a[i][j]=a[i][j-m];
rep(m+1,x,i)
{
rep(1,m,j)a[i][j]=a[i-m][j];
rep(m+1,x,j)a[i][j]=-a[i-m][j-m];
}
solve(x<<1);
}
int main()
{
freopen("1.in","r",stdin);
n=read();
a[1][1]=1;a[1][2]=1;
a[2][1]=1;a[2][2]=-1;
solve(4);
rep(1,n,i){rep(1,n,j)cout<<a[i][j]<<' ';cout<<endl;}
return 0;
}