题目链接


题目大意

f(x)=x的二进制中1的个数f(x)=x的二进制中1的个数f(x)=x的二进制中1的个数
给你一个数组[a1,a2,a3...,am]m∈[1,100][a_1,a_2,a_3...,a_m]m\in[1,100][a1​,a2​,a3​...,am​]m∈[1,100]
问你有多少x∈[1,1e18]x\in[1,1e18]x∈[1,1e18]满足f(x+i)%2=aif(x+i)\%2=a_if(x+i)%2=ai​


解题思路:

首先我们发现m∈[1,100]m\in[1,100]m∈[1,100]很小,那么m最多可以影响的二进制位的长度是7位而已[0,6][0,6][0,6]。
如果前面7位要进位到后面去,那么就要看一下从第7位开始后面多少位1,就是进位的情况

那么我们就可以搞搞数位dp了,在数位dp的时候我们还要看看前面已经出现了多少个1了,到了[0,6][0,6][0,6]位的时候我们可以暴力枚举所有额组合情况

我们dp[len][num1][num2][lim]dp[len][num_1][num_2][lim]dp[len][num1​][num2​][lim]就表示:现在已经到了第lenlenlen位,前面有num1个1num_1个1num1​个1有num2num_2num2​个连续的1接在第7位后面,limlimlim表示前面是否取到上界

那么就这么结束了吗?
我们算一下复杂度:
len∗num1∗num2∗lim∗128∗100=6,710,886,400len*num_1*num2*lim*128*100=6,710,886,400len∗num1​∗num2∗lim∗128∗100=6,710,886,400
len=num1=num2=64len=num1=num2=64len=num1=num2=64
肯定T飞了
我们考虑优化一下,它最后实际上面只考虑1个数的奇偶性而已,我们没必要存储前面1的个数,我们只要存前面的奇偶个数就行了,那么num1=num2=2num1=num2=2num1=num2=2
复杂度就降下去了大概就6,553,6006,553,6006,553,600大部分都跑不满的


AC code

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}
int m;
ll L;
bool arr[maxn];
vector<int> bit;
ll dp[70][2][2][2];
int f[300]; // f[i]存储的是i的二进制的前7位的二进制里面1的个数
inline ll cal(int seq, int is, int lim) {int up = lim ? (L % 128) : 127;ll ans = 0;for(int j = 0; j <= up; ++ j) {bool ok = 1;for(int i = 0; i < m && ok; ++ i) {int now = i + j;if(now >> 7 & 1) ok = (((f[i+j]+is-seq+1)&1)==arr[i]); // 进位else ok = (((f[i+j]+is)&1)==arr[i]);}ans += ok;}return ans;
}
// 第几位,7位开始往后面连续1的个数,前面1的个数,是否取得上界
inline ll dfs(int len ,bool seq, bool is, int lim) {ll &x = dp[len][seq][is][lim];if(~x) return x;if(len <= 6) {x = cal(seq,is,lim);return x;}int up = (lim ? bit[len] : 1);ll ans = 0;for(int i = 0; i <= up; ++ i) {if(i) ans += dfs(len-1,(seq+1)&1,(is+1)&1,i==up&&lim);else ans += dfs(len-1,0,is,i==up&&lim);}return x = ans;
}inline ll slove(ll L) {ms(dp,-1);bit.clear();for(int i = 0; i <= 63; ++ i) {bit.push_back(L>>i&1);}return dfs(bit.size(),0,0,1);
}int main() {IOS;for(int i = 0; i < 300; ++ i) for(int j = 0; j < 7; ++ j)f[i] += (i >> j) & 1;int _;cin >> _;while(_--) {cin >> m >> L;for(int i = 0; i < m; ++ i) cin >> arr[i];cout << slove(L) << endl;}return 0;
}

数位dp ---- 暴力 + 二进制的数位dp 2020济南 L Bit Sequence相关推荐

  1. 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)

    dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...

  2. 数位DP学习整理(数位DP看完这篇你就会了)

    文章目录 数位DP 数位DP介绍 数位DP解法 数位DP经典例题 例题1:度的数量 例题2:计数问题 例题3:数字游戏 例题4:windy数 例题5:数字游戏Ⅱ 例题6:不要62 例题7:恨7不成妻 ...

  3. [SOCI2005]最大子矩阵(DP) + [JXOI2018]守卫(DP) + [CQOI2016]手机号码(数位DP)[各种DP专练]

    DP专练博客 DP专练 T1:最大子矩阵 题目 题解 代码实现 T2:守卫 题目 题解 代码实现 T3:手机号码 题目 题解 代码实现 T1:最大子矩阵 题目 这里有一个n*m的矩阵,请你选出其中k个 ...

  4. 2020牛客暑期多校训练营(第八场)E.Enigmatic Partition(差分+隔项差分/dp+暴力)

    题目 n的m划分是把n划分成m个数之和,令,要求满足: ,, 计f(n)为n的满足上述限制的划分数, T(T<=1e4)组询问,每次给出l,r(1<=l<=r<=1e5),询问 ...

  5. Leetcode 526.优美的排列 二进制状压DP

    题目链接:传送门 假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数 ...

  6. 第 256 场力扣周赛(状态压缩+dp,二进制子序列的动规、940)

    第 256 场力扣周赛 有事没做,来看一下题 5854. 学生分数的最小差值 题目描述 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整 ...

  7. 十进制与二进制的数位关系

    在C++精度范围内符合:2进制与10进制转换时的位数,符合2^10=10^3,需要多了24,但是对数位没有影响 二进制下的2^i次方的值,逢10,十进制下就多3位(3个0),余0~3不变,余4~6加一 ...

  8. 计蒜客 2020 蓝桥杯省赛 B 组模拟赛(五)E区间dp H 裴蜀 J dp A-J 权值线段树

    题目链接 因为要去笔试.所以只打了两个小时,有点求快,很多细节没写好就匆匆交,而且没有检查,打的有点菜 C-煎牛排 做法: 所有的面的个数sum=2*n   然后sum/(2*k)即可. ans=ma ...

  9. 思维dp ---- CF41D Pawn [可达状态统计dp]

    题目链接 题目大意: 解题思路: 如果没有 k+1∣∑wk+1|\sum wk+1∣∑w 的限制的话就是个简单的 dp dp[i][j]=max(dp[i+1][j−1],dp[i+1][j+1])d ...

最新文章

  1. 如何让Unity支持中文
  2. c 多线程mysql_多线程读写mysql数据库
  3. 特征值 与特征向量(机器学习算法原理与实践)
  4. webuploader 跨域
  5. 解析Python中的条件语句和循环语句
  6. SpringBoot AOP拦截器
  7. MySQL year()函数
  8. php检测数组类型,javascript中通过哪些方法来检测数组类型?
  9. 使用Quartus进行功能仿真时出现“testbench_vector_input_file option does not exist”的解决方法
  10. java 写文件 并发_记录一次Java文件锁引起的并发写文件问题
  11. vscode下载安装及中文配置
  12. iconfont矢量图标库的引用方法
  13. 43岁读NLP博士,一位70后的励志人生
  14. 软件工程之软件开发方法、软件工具和开发环境
  15. HTML5 实例:旋转同时放大缩小的方块(canvas)
  16. vagrant制作box
  17. Learning-Based Approximation of Interconnect Delay and Slew in Signoff Timing Tools
  18. 前端追梦人响应式网页设计
  19. Percona-XtraBackup系列一:安装 perl(Time::HiRes) is needed by percona-xtrabackup-2.2.10-1.el6.x86_64...
  20. 自动分析黑名单及白名单的iptables脚本

热门文章

  1. YOLOv5实现自定义对象训练与OpenVINO部署全解析
  2. 百度关键词研究: 应避免的5个错误!
  3. 4 Git 基础 - 撤消操作
  4. zabbix3.0禁用guest用户
  5. 使用 bcp 指定数据文件中的前缀长度
  6. C# 窗体位置 Show和ShowDialog (转载)
  7. 开启Mac充电提示音
  8. 数据结构和算法笔记1 算法的定义,特性,设计要求
  9. CA证书服务器(4) 证书、CA、PKI
  10. Flash(JSFL)