小米网络赛 热身赛 C题 CDMA

Pro:
https://ac.nowcoder.com/acm/contest/8409/C
构造一个大小为\(2^k * 2^k\)的只包含\(+1\)\(-1\)的矩阵
使得这个矩阵的任意两行做点乘的的结果为0
\(k<=10\)

Sol:
很容易想到这个题应该会和递归有关系
再手玩\(k=1,k=2,k=4\)即可猜到做法
要构造\(2^k\)的解
只需先得到$2^{(k-1)}的解
然后重复四次并将右下角取反即可

#include<bits/stdc++.h>
#define N 5500
#define db double
#define ll long long
#define ldb long double
#define ull unsigned long long
using namespace std;
const int h=3,ki=149,mo=998244353;
inline int inc(int x,int k){x+=k;return x<mo?x:x-mo;}
inline int dec(int x,int k){x-=k;return x>=0?x:x+mo;}
inline int read()
{
	char ch=0;int x=0,flag=1;
	while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0',ch=getchar();}
	return x*flag;
}
inline void write(int x)
{
	if(!x)return (void)putchar(48);
	if(x<0)putchar(45),x=-x;
	int len=0,p[20];
	while(x)p[++len]=x%10,x/=10;
	for(int i=len;i>=1;i--)putchar(p[i]+48);
}
const db eps=1e-7,inf=1e9+7,pi=acos(-1);
inline db Read(){db x;scanf("%lf",&x);return x;}
inline void Write(db x){printf("%lf",x);}
int ans[N][N];
void solve(int n)
{
	if(n==0){ans[1][1]=1;return;}
	solve(n/2);
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
	ans[i+n][j]=ans[i][j+n]=ans[i+n][j+n]=ans[i][j];
	
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans[i][j]=-ans[i][j];
}
int main()
{
	int n=read();
	solve(n);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	write(ans[i][j]),putchar((j==n)?'\n':' ');
	return 0;
}
posted @ 2020-11-11 22:45  Creed-qwq  阅读(93)  评论(0编辑  收藏  举报