C. Unusual Product
http://codeforces.com/problemset/problem/405/C
对一个矩阵操作 输入1 后面接着的这个数是改变的行号 输入2 后面接着的这个数是改变的列号 输入3 输出矩阵计算的结果
改变就是将整行或列 的每个数^1(取反) 计算就是求行乘列的和 如:
1 1 1
0 1 1 = (1·1 + 1·0 + 1·1) + (0·1 + 1·1 + 1·0) + (1·1 + 0·1 + 0·0) = 0 + 1 + 1 = 0 模上2
1 0 0
= (a11*a11+a12*a21+a13*a31)+(a21*a12+a22*a22+a23*a32)+(a31*a13+a32*a23+a33*a33) 数字表示双下标 ij
观察发现某一行(列) 的每个位置都会计算2次 除了i==j时
那么我们改变某一行(列) 矩阵值必然改变一次 因为mod 2 计算2次等于没有改变 然后aij (a==j)会取反
难以表述...
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
typedef long long LL;
int a[1005][1005];
int n;
int c=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]&&a[j][i])
c++;
}
c%=2;
}
int m;
scanf("%d",&m);
while(m--)
{
int k;
scanf("%d",&k);
if(k==3)
printf("%d",c);
else
{
int v;
scanf("%d",&v);
c^=1;
}
}
printf("\n");
// system("pause");
return 0;
}
D. Toy Sum
给一个集合X 求在0-100w内集合Y(X,Y没有公共子集) 满足
s规定为100w
输出一个满足条件的集合y
设N=1000000
对于每个数x我们可以找到对应的y=N-(x-1) 并标记
但是有种情况是y=N-(x-1) 已经是集合X的数了
如 X为 2 999999
N-(2-1)=999999
我们必须要满足X,Y没有公共子集
其实这种情况只会出现在x+y=N+1
那么我只要再找2个数a+b=N+1=x+y 并且a,b(b=N+1-a)未被标记
遍历即可
#include<cstdio>
#include<vector>
using namespace std;
#define N 1000000
vector<int> mm;
bool Hash[N+5];
int a[N+5];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
Hash[a[i]]=1;
}
int f=n;
for(int i=1;i<=n;i++)
{
if(Hash[N-(a[i]-1)]==0)
{
Hash[N-(a[i]-1)]=1;
mm.push_back(N-(a[i]-1));
f--;
}
}
int i=1;
while(f>0)
{
if(Hash[i]==0&&Hash[N-i+1]==0)
{
Hash[i]=1;
Hash[N-i+1]=1;
mm.push_back(i);
mm.push_back(N-i+1);
f-=2;
}
i++;
}
printf("%d\n",mm.size());
for(int i=0;i<mm.size();i++)
{
if(i==mm.size()-1)
printf("%d\n",mm[i]);
else
printf("%d ",mm[i]);
}
//system("pause");
return 0;
}