每日一题 #468. 函数求和

142 篇文章 0 订阅
142 篇文章 1 订阅

注意要把1转为ll !!!

本来是一个美好的下午的,但让这题毁了,当然主要是因为我是sb

如果按照题意去模拟的话那直接T上天,一开始我以为只要是两个数不相等,他们的异或就不会等于a[i],从这里我就是个sb了,因为x可以比a[i]大,只要a[i]的1 x都有,那么x&a[i]=a[i],所以我这个sd思路就挂了;我们可以反着想一下,假设一开始二进制位(一开始有k位)都是空的,可以放0也可以放1,我们找x&a[i]=a[i]满足条件的i,比如a[1]的二进制是000011100,那原来的空位就被填成了000011100,这些0可以放0也可以放1,那么a[1]的贡献就是2的9次方-2的6次方(k=9,0剩下6个),再往下一直找,找到了a[i],a[i-1]的时候还剩下d个0,到了a[i-1]还剩下e个0,那a[i]的贡献就是(2的d次方-2的e次方)*i;仔细想一想就懂了,脑子已经垮掉了,说的好像不是很清楚

函数求和 - 题目 - Daimayuan Online Judge

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const int mod=998244353;
ll qpow(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll n,k,a[100005],b[105];
int main(){
    //freopen("in.txt","r",stdin);
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
   ll cnt=k,fr=(1LL<<k),ans=0;//不要忘了要把1转化为ll的形式,fr不用取模,不然会出负值
    for(int i=1;i<=n;i++){
        for(int j=0;j<=k;j++){
            if((a[i]>>j)&1){
                if(!b[j]) b[j]=1,cnt--;
            }
        }
        ll ccnt=(1LL<<cnt);
        ans=(ans+(fr-ccnt)*i%mod)%mod;
        fr=ccnt;
    }
    cout<<ans<<endl;
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

killer_queen4804

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值