51nod1674??????????????????2??????????????????&???|???????????????
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod1674??????????????????2??????????????????&???|???????????????相关的知识,希望对你有一定的参考价值。
?????????NPU strong ?????? name scan IV second lld ??????
lyk?????????????????????
?????????????????????????????????????????????????????????and????????????????????????????????????or????????????????????????
??????3??????2,3,6?????????and???????????????2???or???????????????7????????????????????????????????????2*7=14???
??????lyk?????????n????????????????????????????????????n*(n+1)/2???????????????????????????1000000007??????????????????????????????
????????????????????????{3,4,5}??????????????????1,11,1,1,21,2,1,31,3,2,22,2,2,32,3,3,33,3??????????????????9,0,0,16,20,25???
Input??????????????????n(1<=n<=100000)???
???????????????n??????ai????????????n??????(0<=ai<=10^9)???Output?????????????????????Sample Input
3 3 4 5
Sample Output
70
???????????????????????????&??????|??????
???????????????????????????????????????????????????????????????map??????????????????????????????????????????
??????????????????gcd?????????????????????????????????
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=100010; const int Mod=1000000007; ll ans; ll a[maxn],And[maxn],Or[maxn]; map<pair<ll,ll>,ll>mp; map<pair<ll,ll>,ll>::iterator it; void solve(int L,int R) { if(L>R) return ; int Mid=(L+R)>>1; mp.clear(); And[Mid]=a[Mid]; Or[Mid]=a[Mid]; mp[make_pair(And[Mid],Or[Mid])]++; for(int i=Mid-1;i>=L;i--){ And[i]=And[i+1]&a[i]; Or[i]=Or[i+1]|a[i]; mp[make_pair(And[i],Or[i])]++; } for(int i=Mid;i<=R;i++){ for(it=mp.begin();it!=mp.end();it++) ans+=(ll)(And[i]&(*it).first.first)*(Or[i]|(*it).first.second)%Mod*(*it).second%Mod; } solve(L,Mid-1); solve(Mid+1,R); } int main() { int N,i,j; scanf("%d",&N); for(i=1;i<=N;i++) scanf("%lld",&a[i]); solve(1,N); printf("%lld ",ans); return 0; }
???????????????
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=100010; const int Mod=1e9+7; int a[maxn],And[maxn],Or[maxn]; ll ans; map<pair<int,int>,int>mp,tp; map<pair<int,int>,int>::iterator it1,it2; void solve(int L,int R) { if(L>R) return ; int Mid=(L+R)>>1; mp.clear(); tp.clear(); And[Mid]=a[Mid]; Or[Mid]=a[Mid]; mp[make_pair(And[Mid],Or[Mid])]++; for(int i=Mid-1;i>=L;i--){ And[i]=And[i+1]&a[i]; Or[i]=Or[i+1]|a[i]; mp[make_pair(And[i],Or[i])]++; } tp[make_pair(And[Mid],Or[Mid])]++; for(int i=Mid+1;i<=R;i++){ And[i]=And[i-1]&a[i]; Or[i]=Or[i-1]|a[i]; tp[make_pair(And[i],Or[i])]++; } for(it1=mp.begin();it1!=mp.end();it1++) for(it2=tp.begin();it2!=tp.end();it2++) ans=(ans+(ll)((*it1).first.first&(*it2).first.first)*((*it1).first.second|(*it2).first.second)%Mod*(*it1).second*(*it2).second)%Mod; solve(L,Mid-1); solve(Mid+1,R); } int main() { int N,i,j; scanf("%d",&N); for(i=1;i<=N;i++) scanf("%d",&a[i]); solve(1,N); printf("%lld ",ans); return 0; }
以上是关于51nod1674??????????????????2??????????????????&???|???????????????的主要内容,如果未能解决你的问题,请参考以下文章