n度あることはn+1度ある

書きたいことを書く 統一性はない

Dwango Programming Contest V B - Sum AND Subarrays

最近さぼりすぎなので頑張っていきたいです。
解答は解説で明らかなのですが、実装でてこずった問題。
flagを作るときにシフト演算を使用していたのですが、オーバーフローしていてずっと躓いていました。
シフト演算ではあまり大きなシフトを行うとオーバーフローするようなので、この問題のような場合は、pow関数などを代用したほうがよさそうです。またif((temp&x)==temp)のところですが、temp&xにかっこをつけないと、計算が合わず少し悩みました。論理算術演算を含めた優先順序をちゃんと覚えたほうがよさそうです。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int N,K; cin>>N>>K;
    vector<long> a(N);
    for(int i=0;i<N;i++)
        cin>>a[i];
    vector<long> s;
    for(int i=0;i<N;i++){
        long sum=0;
        for(int j=i;j<N;j++){
            sum+=a[j];
            s.push_back(sum);
        }
    }
    long flag=0;
    for(int i=40;i>=0;i--){
        long temp=flag|(long)pow(2,i);
        long count=0;
        for(auto x:s){
            if((temp&x)==temp)
                count++;
        }
        if(count>=K)
            flag+=(long)pow(2,i);
    }
    cout<<flag;
}