IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> AtCoder ABC129E Sum Equals Xor 动态规划 -> 正文阅读

[数据结构与算法]AtCoder ABC129E Sum Equals Xor 动态规划

题目传送门

Describtion

以二进制给定一整数 L L L ,求有多少二元组 ( a , b ) (a,b) (a,b) 满足 a + b = a ⊕ b ≤ L a+b=a\oplus b\leq L a+b=abL

Solution

a , b a,b a,b 的二进制形式的每一位进行讨论。
因为异或是不进位加法,所以 a + b = a ⊕ b a+b=a\oplus b a+b=ab 相当于 a a a b b b 的同一位不能同为 1 1 1
d p [ i ] [ 0 ] dp[i][0] dp[i][0] a ⊕ b a\oplus b ab 的前 i i i 位小于 L L L 的前 i i i 位的方案数, d p [ i ] [ 1 ] dp[i][1] dp[i][1] 则为等于的方案数。

  • L L L 的当前位为 1 1 1。此时等于的情况为上一位等于且 a , b a,b a,b 分别取 1 , 0 1,0 1,0 0 , 1 0,1 0,1,即 d p [ i ] [ 1 ] = d p [ i ? 1 ] [ 1 ] × 2 dp[i][1]=dp[i-1][1]\times2 dp[i][1]=dp[i?1][1]×2。小于的情况有两种:上一位小于,则有 3 3 3 种情况: 0 , 0 0,0 0,0 0 , 1 0,1 0,1 1 , 0 1,0 1,0 ;上一位等于的情况就 1 1 1 种: 0 , 0 0,0 0,0,即 d p [ i ] [ 0 ] = d p [ i ? 1 ] [ 0 ] × 3 + d p [ i ? 1 ] [ 1 ] dp[i][0]=dp[i-1][0]\times3+dp[i-1][1] dp[i][0]=dp[i?1][0]×3+dp[i?1][1]
  • L L L 的当前位为 0 0 0。等于的情况为上一位等于且 a , b a,b a,b 都取 0 0 0,即 d p [ i ] [ 1 ] = d p [ i ? 1 ] [ 1 ] dp[i][1]=dp[i-1][1] dp[i][1]=dp[i?1][1]。小于的情况只有 3 3 3 种,即上一位小于, a , b a,b a,b 分别取 0 , 0 0,0 0,0 0 , 1 0,1 0,1 1 , 0 1,0 1,0

最终答案即为 d p [ n ] [ 1 ] + d p [ n ] [ 0 ] dp[n][1]+dp[n][0] dp[n][1]+dp[n][0], n n n即为 L L L的二进制长度。

Code

#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
long long n,dp[105000][2];
char s[105000];
int main(){
	scanf("%s",s+1);
	n=strlen(s+1);
	dp[0][1]=1;//初始化
	for(int i=1;i<=n;++i){
		dp[i][0]=(dp[i-1][0]*3)%mod;
		if(s[i]=='1'){
			dp[i][0]=(dp[i][0]+dp[i-1][1])%mod;
			dp[i][1]=(dp[i-1][1]*2)%mod;
		}
		else dp[i][1]=dp[i-1][1];
	}
	printf("%lld\n",(dp[n][0]+dp[n][1])%mod);
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章           查看所有文章
加:2021-08-08 11:34:33  更:2021-08-08 11:51:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:58:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码