列表

详情


NC50586. 2^k 进制数

描述

设r是个进制数,并满足以下条件:
  • r至少是个2位的进制数。
  • 作为进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。
  • 将r转换为2进制数q后,q的总位数不超过w。
在这里,正整数k和w是事先给定的。
问:满足上述条件的不同的r共多少个?

输入描述

输入只一行,为两个正整数k和w。

输出描述

输出为一行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示,要求最高位不得为0,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。
提示:作为结果的正整数可能很大,但不会超过200位。

示例1

输入:

3 7

输出:

36

原站题解

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

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 480K, 提交时间: 2020-08-13 16:31:19

#include<cstdio>
#include<algorithm>
#define maxn1 200
#define maxn2 1000
using namespace std;
 
int ans[maxn1+20];
int f[maxn2+100][maxn1+20];
 
void add(int a[],int b[])
{
  int i,j,k,last=0;
  a[0]=max(a[0],b[0]);
  for(i=1;i<=a[0];i++)
    {
      a[i]+=b[i]+last;
      last=a[i]/10,a[i]%=10;
    }
  if(last>0)a[++a[0]]=last;  
}
 
int main()
{
  int i,j,k,x,y,w;
  scanf("%d%d",&k,&w);
  if(w<=k){printf("0\n");return 0;}
  
  y=(1<<k)-1;
  if(w%k==0)x=y,k=w/k-1;
  else x=(1<<(w%k))-1,k=w/k;
   
  f[1][0]=1,f[1][1]=1;  
  ans[0]=0;
  
  for(i=1;i<=y;i++)
    {
      for(j=i+1;j>=1;j--)
	    add(f[j],f[j-1]);
	  if(i>=y-x && i<y)add(ans,f[k+1]);  
    }
  for(i=3;i<=k+1;i++)add(ans,f[i]);
  for(i=ans[0];i>=1;i--)printf("%d",ans[i]);
  printf("\n");  
  return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 9ms, 内存消耗: 580K, 提交时间: 2020-06-02 20:06:02

#include<cstdio>
#include<algorithm>
#define maxn1 200
#define maxn2 1000
using namespace std;
int ans[maxn1+20];
int f[maxn2+100][maxn1+20];
void add(int a[],int b[])
{
	int i,j,k,last=0;
	a[0]=max(a[0],b[0]);
	for(i=1;i<=a[0];i++)
	{
		a[i]+=b[i]+last;
		last=a[i]/10,a[i]%=10;
	}
	if(last>0)
	a[++a[0]]=last;
}
int main()
{
	int i,j,k,x,y,w;
	scanf("%d%d",&k,&w);
	if(w<=k)
	{
		printf("0\n");
		return 0;
	}
	y=(1<<k)-1;
	if(w%k==0) x=y,k=w/k-1;
	else x=(1<<(w%k))-1,k=w/k;
	f[1][0]=1,f[1][1]=1;
	ans[0]=0;
	for(i=1;i<=y;i++)
	{
		for(j=i+1;j>=1;j--)
		add(f[j],f[j-1]);
		if(i>=y-x&&i<y)
		add(ans,f[k+1]);
	}
	for(i=3;i<=k+1;i++)
	add(ans,f[i]);
	for(i=ans[0];i>=1;i--)
	printf("%d",ans[i]);
	printf("\n");
	return 0;
}

Python3(3.9) 解法, 执行用时: 115ms, 内存消耗: 14248K, 提交时间: 2021-05-10 20:58:37

C=[[0 for j in range(i+1)]for i in range(515)]
def pre():
        for i in range(1,513):
                C[i][0]=C[i][i]=1
        for i in range(1,513):
                for j in range(1,i):
                        C[i][j]=C[i-1][j]+C[i-1][j-1]
if __name__=="__main__":
        pre()
        k,w=map(int,input().split(' '))
        a=int(w/k)
        b=w%k
        ans=0
        for i in range(1,2**b+1):
##                print(2**k-i,a)
                if a<=2**k-i:
                        ans+=C[2**k-i][a]
                
        for i in range(2,a):
##                print(2**k-1,i)
                if i <=2**k-1:
                        ans+=C[2**k-1][i]
        print(ans)

上一题