暴力解超时:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N];
signed main()
{
int n;cin>>n;
int t1=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
t1+=a[i];
}
int t2=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
int yu=a[i]&a[j];
int huo=a[i]|a[j];
t2+=yu+huo;
}
}
cout<<t1+t2<<endl;
return 0;
}
正解
直接说结论: a&b + a|b =a+b
反推: a&b的结果无非就两种:0,1
a|b的结果无非就两种:0,1
a&b + a|b的结果无非就四种:
我们发现a&b完 和 a||b完 相加的结果 和a直接+b的结果一样.
因此a&b + a|b =a+ba&b + a|b =a+b的结论是成立.
因为题目说了 在魔法项链中,任意两颗珠子都会产生共鸣。并且
魔法项链的总魔力值是每对魔法珠子共鸣产生魔力值贡献的总和,再加上所有魔法珠子自身魔力值的总和的结果。
假设一个珠子的魔力为num,那么它与剩下的n-1个珠子都要配对(贡献魔力),那么一共就要贡献n次魔力(算上自身).
用公式表示为:
code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N];
int ans;
signed main()
{
int n;cin>>n;
for(int i=0;i<n;i++)
{
int num;cin>>num;
ans+=num*n;
}
cout<<ans;
return 0;
}