【HIHOCODER 1526】 序列的值(二进制DP)
2017-07-14 17:13
253 查看
时间限制:20000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个长度为 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])之和。
输入
第一行一个正整数 n。
接下来一共有 n 行。第 i+1 行包含一个非负整数 a[i]。
1 ≤ n ≤ 105
0 ≤ a[i] < 231
输出
输出答案对 998244353 取模后的值。
样例输入
2
1
2
样例输出
4
题解
dp[j][k]代表前i个数里第j位是k的子序列的个数,状态转移方程为:
$(1)dp[j][k]=dp[j][k]+dp[j][!k] $
--->当a[i]的第j位为1
\((2)dp[j][k]=dp[j][k]*2\)
--->当a[i]的第j位为0
那么,最后的答案为
\[\sum\limits_{j=0}^{j<=31}{dp[j][0]\times2^{n-i}}\]
参考代码
#include<queue> #include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define ll long long #define inf 30005 using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } void Out(ll a){ if(a<0) putchar('-'),a=-a; if(a>=10) Out(a/10); putchar(a%10+'0'); } const int N=100000+10,SIGMA=31,MOD=998244353; int a ,b ,dp[SIGMA+10][2]; int main(){ int n=read(),ans=0; for(int i=1;i<=n;i++) a[i]=read(); b[0]=1; for(int i=1;i<=n;i++) b[i]=(ll)b[i-1]*2%MOD; for(int i=0;i<=SIGMA;i++) dp[i][0]=1; for(int i=1;i<=n;i++){ for(int j=SIGMA;i>=0;j--) if(a[i]&(1<<j)){ ans=(ans+(ll)dp[j][0]*b[n-i])%MOD; break; } for(int j=0;j<=SIGMA;j++){ int l=dp[j][0],r=dp[j][1]; if (a[i]&(1<<j)){ dp[j][0]=(l+r)%MOD; dp[j][1]=(l+r)%MOD; } else{ dp[j][0]=l*2%MOD; dp[j][1]=r*2%MOD; } } } Out(ans); puts(""); return 0; }
相关文章推荐
- 【DP?】hihocoder1526 序列的值
- hihoCoder 1149 回文字符序列 (区间dp)
- Hihocoder 1259 :A Math Problem(2015 北京区域赛 K,二进制的数位dp)
- [hihocoder1526]序列的值
- hihocoder-1526 序列的值(DP/二进制)
- hihocoder 1149 : 回文字符序列(区间dp)
- 字节(bytes) 二进制序列类型
- hihoCoder 1044 状态压缩·一 (状压dp)
- [BZOJ3675][Apio2014]序列分割(斜率优化dp)
- hdu 1231 最大连续子序列 (dp)
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 动态规划:ZOJ1074-最大和子矩阵 DP(最长子序列的升级版)
- POJ 2533 Longest Ordered Subsequence (DP,最长递增序列)
- hiho-hihoCoder挑战赛29-D-不上升序列
- 九度oj 和为S的连续正数序列 1354 (机智DP) 好题
- 2015编程之美初赛1 hihoCoder1158 质数相关 树形DP
- 二进制序列有多少个1
- 哈理工OJ 1597 序列问题II(水DP)
- hdu4513 最长递增回文序列 manacher + dp
- 用递归和非递归的方法把一个十进制数转换为二进制序列