首页 > 其他分享 >ZCMU-1033

ZCMU-1033

时间:2024-04-06 13:55:45浏览次数:33  
标签:sub int 40 ZCMU break long 1033 makedp

image
image

我觉得这位大佬说的已经很好了,可以直接看她的思路了;
大佬思路
但是她的代码没有考虑到1 1 1 1的情况,
代码思路
这个是可以的很长且没有注释;

#include<bits/stdc++.h>
using namespace std;
long long d[40][40];
long long c[40][40];
long long a[40];
long long x,y;
int k,b;
long long makedp(int i,int j,long long sub){
	//该函数表示从i个位置当中选j个位置赋值为1且小于等于sub; 
	if(i==0){ 
		if(j==0&&sub==0){
			return 1;
		}
		else return 0;
	}
	if(i<j){//不够要求 
		return 0;
	}
    if(sub==0){
		if(j==0){
			return 1;//找0位 
		}
		else{
			return 0;
		}
	}
	else if(sub>=d[i][j]){
		//这里很好的避免了重复; 
		return c[i][j];//最大,就找小于他的最多 
	}
	long long sum=0;
	sum+=makedp(i-1,j,sub);//取消最高位太大减小 
	sum+=makedp(i-1,j-1,sub-a[i]);//在保证最高位在的情况 
	return sum;
}
void init(){
	memset(a,0,sizeof(a));
	memset(d,0,sizeof(d));
	long long t=1;
	a[1]=t;
	for(int i=2;i<=32;i++){
		t=t*b;
		if(t>y){
			break;
		}
		a[i]=t;//a数组表示的是b^(i-1); 
	}
	d[1][1]=1;
	for(int i=2;i<=32;i++){
		if(a[i]==0){
			break;
		}
		for(int j=1;j<=i;j++){
			//d=b^(i-1)+b^(i-2)+..有j个元素 
			d[i][j]=d[i][j-1]+a[i-j+1];
		}
	}
}
int main(){
	for(int i=0;i<=32;i++){
		c[i][0]=1;
	}
	//这里表示的是组合数,
	//从i位数中取出j个来。 
	for(int i=1;i<=32;i++){
		for(int j=1;j<=i;j++){
			c[i][j]=c[i-1][j]+c[i-1][j-1];
		}
	}
	while(~scanf("%lld%lld%d%d",&x,&y,&k,&b)){
		init();
		int u;
		for(int i=1;i<=32;++i){
			//找到不超过y的b^(i-1) 
			if(a[i]>y){
				u=i-1;//所以减一 
				break;
			}
			else if(a[i]==0){
				u=i-1;
				break;
			}
		}
		long long t1=makedp(u,k,y);
		for(int i=1;i<=32;++i){
			if(a[i]>x-1){
				u=i-1;
				break;
			}
			else if(a[i]==0){
				u=i-1;//超出2 
				break;
			}
		}
		long long t2=makedp(u,k,x-1);
		//适用减法行为 
		cout<<t1-t2<<endl;
	}
	return 0;
}

标签:sub,int,40,ZCMU,break,long,1033,makedp
From: https://www.cnblogs.com/hai-zei/p/18114964

相关文章

  • ZCMU操作系统课程实验 - 实验1-Linux的使用
    登录1.打开这个东西2. 在  文件->打开    中打卡机房里VMOS文件里的这个东东 3.然后依次操作下去好了,有红色的选项,我都是选的"Donothing"。完成后就会出现这样一个黑框框。4.让你登录。输入:root。密码:superuser    。注意输入密码的时候,密......
  • ZCMU-1038
    其实感觉不太难,读懂题意就行,我一开始没有仔细去读感觉就很懵。其题目意思就是一段字符串含有数字和'<'或者'>',一开始从左开始遍历,遇到'>'这类东西换方向,如果有多次遇到就删之前那一个;遇到数字就记下,并减去,一直减到0,就删掉思路:无非用一个int类型的数组存放数字打印个数,以及模拟......
  • ZCMU_1117
    /相当于看墙,投影之类的东西让我数多少个建筑物/解释感觉还不到位,以后再看看先强调这不是我原创的,只是加了注释。找到原作者后会加链接。以及改变布局#include<cstdlib>#include<cassert>#include<stack>usingnamespacestd;intmain(void){inti,n,h,coun......
  • oracle提示错误1033,ora-1033
    oracle提示错误1033,ora-1033制造问题和解决问题 文章标签:oracle提示错误1033系统是winxp,使用Imp导入数据到用户user1的时候,关闭了cmd窗口,结果在删除user1的时候,出现了ora-1033错误。解决办法:>connect/assysdba>shutdown>startupmount>alterdatabaserecoverdataba......
  • ORA-01033 : ORACLE initialization or shutdown in progress
    1、问题原因   测试环境反馈某一个模块页面一直加载当中,接口没有返回。   紧接着我就找到这个SQL语句在客户端工具navicat.exe上去执行,执行了整整一个半小时没有返回,navicat还关闭不了,最后实在受不了直接杀死navicat的进程。   这个时候重新打开navicat.exe连接......
  • #P1033. 迷宫问题
    题意是:给你一个迷宫,起点为S,终点为T,.表示空格,#表示障碍物无法通过,你每次可以从当前位置上下左右移动(不能出界或者撞到障碍物上)你需要找出从起点到终点的最少步数,如果不存在解,输出-1。BFS的练手题usingnamespacestd;intsx,sy,ex,ey;intn,m;intdx[4]={0,0,1,-1};intdy[4......
  • PAT_B1033 旧键盘打字
    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?输入格式:输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过 105 个字符的串......
  • Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法
    出现原因:主要是我把F盘的数据库文件给删了导致的(这个是我遇到的问题,可能还有其他情况下也会出现这种问题)第一步,运行cmd,输入:sqlplus/assysdba  第二步,输入:startup第三步,输入:shutdownabort第四步,重新输入:startup命令,这时会报如下错误,这种情况主要是我把数据库文件给删了......
  • Oracle ORA-01033: ORACLE initialization or shutdown in progress(误删了DBF数据库
    先声明一下前期的一些手欠欠儿的操作导致oracl登录不进去了,起先是清理磁盘空间的时候误删除了orcleDBF数据文件后无法进入系统,plsql登录报错如下:一般情况下,删除表空间的正确方法是:DROPTABLESPACEBDCDJINCLUDINGCONTENTSANDDATAFILES;如果没有通过以上命令删除而直接删除......
  • 1033. 移动石子直到连续
    1033.移动石子直到连续三枚石子放置在数轴上,位置分别为a,b,c。每一回合,你可以从两端之一拿起一枚石子(位置最大或最小),并将其放入两端之间的任一空闲位置。形式上,假设这三枚石子当前分别位于位置x,y,z且x<y<z。那么就可以从位置x或者是位置z拿起一枚石子,并将该石......