D. Not Quite Lee 题解(裴蜀定理+思维)

题目链接

题目思路

首先考虑只有奇数,那么显然可以,因为奇数可以直接变为0

假如都是偶数偶数全部看成\(a[i]/2\)

那么最后就要满足$ (sum/2) % gcd == 0$ , 这些数的\(gcd\)至少是\(lowbit\) , 如果最小 l\(owbit\) 只有奇数个 那么 sum / 2

之后 肯定不是最小lowbit的倍数了

那么有奇数和有偶数得情况下,显然可以变为0

感觉这个好难解释,其实本质上就是利用裴蜀定理

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n;
int a[maxn];
int cnt[maxn];
ll qw2[maxn];
signed main(){
    scanf("%d",&n);
    qw2[0]=1;
    for(int i=1;i<=n;i++){
        qw2[i]=qw2[i-1]*2%mod;
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        for(int j=30;j>=1;j--){
            if(a[i]%(1<<j)==0){
                cnt[j]++;
                break;
            }
        }
    }
    ll ans=qw2[n]-1;
    for(int i=1;i<=30;i++){
        if(cnt[i]==0) continue;
        int tmp=0;
        for(int j=i+1;j<=30;j++){
            tmp=tmp+cnt[j];
        }
        ans=(ans-qw2[cnt[i]-1]*qw2[tmp])%mod;
    }
    ans=(ans%mod+mod)%mod;
    printf("%lld\n",ans);
    return 0;
}

posted @ 2021-11-24 20:19  hunxuewangzi  阅读(153)  评论(0编辑  收藏  举报