列表

详情


NC228076. 数字匹配

描述

最近比较喜欢二进制数,她认为对于任意两个正整数,当且仅当的二进制非前导零部分最大连续重合位数时,是匹配的,比如的二进制形式为,的二进制形式为,因此最大连续重合部分为,故这两个数的最大连续重合位数为
现在给定一个正整数和一个,求对于所有,满足条件的匹配数

输入描述

读入共一行,包括两个正整数n,k(n≤2000,k≤10)

输出描述

输出共一行,表示匹配数

示例1

输入:

6 2

输出:

7

说明:

2(10)和4(100)
2(10)和5(101)
2(10)和6(110)
3(11)和6(110)
4(100)和5(101)
4(100)和6(110)
5(101)和6(110)
共7对

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 44ms, 内存消耗: 16856K, 提交时间: 2021-11-05 22:11:15

#include <bits/stdc++.h>
using namespace std;
#define b(x) (1<<((x)-1))
int i,j,n,m,t,res,f[2050][2050],msk;
int dfs(int x,int y){
	if(b(m)>x||b(m)>y)return 0;
	if(~f[x][y])return f[x][y];
	return f[x][y]=((x&msk)==(y&msk))?1:(dfs(x>>1,y)|dfs(x,y>>1));
}
int main() {
	memset(f,-1,sizeof(f));
	cin>>n>>m;
	msk=b(m+1)-1;
	for(i=1;i<=n;i++)for(j=i+1;j<=n;j++)res+=dfs(i,j);
	cout<<res;
}

上一题