C:
https://ac.nowcoder.com/acm/contest/71109/C
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int a[N], b[N];
map<int, int>mp;
int n;
signed main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
cin >> a[i];
for(int j = 1; j <= n; j ++)
cin >> b[j];
int ans = 0;
for(int i = 1; i <= n; i ++)
{
ans += mp[a[i] ^ b[i]];
mp[a[i]^b[i]] ++;
}
//乘2是因为,每次它代表的是i和j,在矩阵中有两个位子的
//+n是因为,对角线只有一个位子
//在上面的循环里,他是先加再加个数的,所以等于说,没有加对角线的
cout << ans * 2 + n << endl;
return 0;
}
D:
https://ac.nowcoder.com/acm/contest/71109/D
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,s,a[100005];
int main()
{
/*比如 17的二进制是10001, 其实就是2^0 + 2^4,
可以理解为,当等于1时候就将他加上,其他的时候都是在
储备2^x,就是一直再算操作次数,如果是1的时候,就
多了一个加到an + 1上面的操作,如果不是的话就继续储备*/
cin>>n>>s;
for(int i=1;i<=n;i++) cin>>a[i];
ll temp=s;
ll cnt=1;
while(temp)//算是二进制算次数
{
if(temp&1) cnt++;
cnt++;
temp/=2;
}
cout<<cnt<<"\n";
cout<<"1 1 1 /\n";
while(s)
{
//如果是1就加上
if(s&1) cout<<n+1<<" "<<n+1<<" 1 +\n";
s/=2;
//储备
cout<<"1 1 1 +\n";
}
}