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??????????????????&???|???????????????的主要内容,如果未能解决你的问题,请参考以下文章

51Nod——T 1631 小鲨鱼在51nod小学

51nod 1631 小鲨鱼在51nod小学

51nod 1185 || 51nod 1072 威佐夫博弈

1674 区间的价值 V2(分治)

51nod 1354:选数字

51nod 1232:完美数