[hihocoder1526]序列的值
来源:互联网 发布:安卓的内存优化 编辑:程序博客网 时间:2024/06/05 22:53
题目描述
给定一个长度为 n 的序列 a[1..n],定义函数 f(b[1..m]) 的值为在 [0,m-1] 内满足如下条件的 i 的数目:
b 中前 i 个数异或起来的值小于 b 中前 i +1个数异或起来的值。
对于 a[1..n] 的每个子序列 b[1..m],求f(b[1..m])之和。
做法
显然只需要对每个位置i求出前面多少子序列异或和比再异或它之后小即可,后面部分乘一个2的次幂。
假如
因此找到a[i]最高位的1,前面的异或和在这一位是0即可。
因此再维护c[j][0/1]两个值表示前i个里多少子序列第j位是0/1。
#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;typedef long long ll;const int maxn=100000+10,maxd=31,mo=998244353;int a[maxn],c[maxd+10][2],two[maxn];int i,j,k,l,t,n,m,ans;int main(){ scanf("%d",&n); fo(i,1,n) scanf("%d",&a[i]); two[0]=1; fo(i,1,n) two[i]=(ll)two[i-1]*2%mo; fo(i,0,maxd) c[i][0]=1; fo(i,1,n){ fd(j,maxd,0) if ((a[i]&(1<<j))>0) break; (ans+=(ll)c[j][0]*two[n-i]%mo)%=mo; fo(j,0,maxd){ l=c[j][0];t=c[j][1]; if ((a[i]&(1<<j))>0){ c[j][0]=(l+t)%mo; c[j][1]=(l+t)%mo; } else{ c[j][0]=l*2%mo; c[j][1]=t*2%mo; } } } printf("%d\n",ans);}
阅读全文
1 1
- [hihocoder1526]序列的值
- 序列的值探究
- 序列的值探究
- 计算二进制序列的值
- 查找序列的下一个值
- 求序列中最长子序列的值
- 序列的最长递减序列
- 管理序列+序列的伪列+修改序列+删除序列
- reset序列到指定的值
- 最大乘积子序列的值
- 和为指定值的连续序列
- 序列中对应列的值相加
- Oracle查询序列的下一个值
- 和为固定值的所有序列
- postgresql更新序列的起始值
- 求序列的最大连续加权值
- hihocoder Challenge 29 A.序列的值
- Python 序列化 保存变量的值
- 算法分析课每周练习 Word Search II
- sql 查询表中所有字段的数据类型
- 解决Centos7下中文显示乱码
- AndroidStudio GsonFormat插件的介绍及集成使用
- vs2013 + QT组件开发串口程序
- [hihocoder1526]序列的值
- Effective C++第二章-构造,析构,赋值 -2
- Spring boot +Quartz +mongodb的分布式定时任务详解
- 类模板函数使用时实例化说明
- Logstash的KV模式自动将数字转换成整数
- 循环链表
- 手机号码,邮箱地址,正则表达式
- Volley自定义一个Request
- 卸载EOS Studio上SVN插件操作过程