AtCoder Beginner Contest 400(ABCDE)

news2025/4/9 13:24:45

A - ABC400 Party

翻译:

          在 ABC400 的纪念仪式上,我们想把 400 人排成 A 行 B 列的长方形,且不留任何空隙。

        给你一个正整数 A,请打印可以这样排列的正整数 B 的值。如果没有这样的正整数 B,则打印-1。

思路:

        判断能否整除即可。

实现:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int MX = 51000;

void solve(){
	int a;
	cin>>a;
	int b = 400/a;
	if (a*b==400){
		cout<<b<<endl; 
	} else{
		cout<<-1<<endl;
	}
}

int main(){
    // 鍏抽棴杈撳叆杈撳嚭娴佸悓姝?
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    // 涓嶄娇鐢ㄧ瀛﹁鏁版硶
    // cout<<fixed;
    // 鍥涜垗浜斿叆涓棿濉繚鐣欏嚑浣嶅皬鏁帮紝涓嶅~榛樿
    // cout.precision();
	solve();	
    return 0;
}



B - Sum of Geometric Series

翻译:

        给你两个正整数N,M。

        让X=\sum\limits^M_{i=0}N^i。如果X<=1e9打印X的值,否则打印inf。

思路:

        暴力求解,当算到X>1e9时直接输出inf。

实现:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MX = 1e9;
ll n,m,ans = 0;
void solve(){
	cin>>n>>m;
	ll now_n = 1;
	for (int i=0;i<=m;i++){
		ans+=now_n;
		now_n *= n;
		if (ans>MX || (now_n>MX && i!=m)){
			cout<<"inf"<<endl;
			return;
		}
	}
	cout<<ans<<endl;
}

int main(){
    // 鍏抽棴杈撳叆杈撳嚭娴佸悓姝?
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    // 涓嶄娇鐢ㄧ瀛﹁鏁版硶
    // cout<<fixed;
    // 鍥涜垗浜斿叆涓棿濉繚鐣欏嚑浣嶅皬鏁帮紝涓嶅~榛樿
    // cout.precision();
	solve();	
    return 0;
}



C - 2^a b^2

翻译:

        当且仅当一个正整数 X 满足以下条件时,它才被称为好整数:

  • 存在一对整数(a,b)如此X=2^a\times b^2

        例如,400 是一个好整数,因为 400 = 2^2\times 10^2

        给定一个正整数 N,求 1 到 N 之间(包括 N)的好整数个数。

思路:

        每个 好整数 的b必定可以是一个奇数,那么先从1开始通过遍历a,结束条件为2^a>N,其间使用二分求出b的最大值,可得到在a_i的情况下有种b是可用的(b要为奇数)。

        注意在二分中可使用mid<X/2^a/mid的方法避免大数相乘。这题中要注意整数溢出问题。(二分,数论)

实现:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
ll N, ans = 0;
ll integer_sqrt(ll x) {
    if (x <= 0) return 0;
    ll left = 0, right = min(x, (ll)1e9)+1; 
    while (left+1 != right) {
        ll mid = (right + left) / 2;
		if (mid <= x / mid) { 
            left = mid ;
        } else {
            right = mid ;
        }
    }
    return left;
}

void solve() {
    cin >> N;
    ll now = 1;
    for (int a = 1; ; a++) {
        now *= 2;
        if (now > N) break;
        ll x = N / now;
        ll tmp = integer_sqrt(x);
        ans += tmp / 2;         
        if (tmp % 2 == 1) ans++; 
    }
    cout << ans << "\n";
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    solve();
    return 0;
}

D - Takahashi the Wall Breaker

翻译:

        高桥正准备去鱼店买鳗鱼。

        他居住的小镇被划分成 H 行 W 列的网格。

        每个单元格要么是一条路,要么是一堵墙。

        我们把从上往下第 i 行(1≤i≤H)和从左往上第 j 列(1≤j≤W)的单元格记为单元格 (i,j)。具体来说,如果 S i 的第 j 个字符(1≤i≤H,1≤j≤W)是 .,则(i,j) 单元是一条路;如果是 #,则 (i,j) 单元是一堵墙。

        他可以按任意顺序重复执行以下两种操作:

  • 移动到相邻的单元格(向上、向下、向左或向右),该单元格位于小镇内且是道路。
  • 从四个方向(上、下、左或右)中选择一个,然后朝该方向踢一脚。
  • 当他踢出前踢腿时,在距离他当前所在的小格最多 2 步远的地方,如果该小格是墙,就会变成路。
  • 如果最远 2 步之外的一些单元格在城镇之外,则仍然可以进行前踢,但城镇之外的任何东西都不会改变。

        他从(A,B)单元格开始,想移动到(C,D)单元格的鱼店。他开始所在的单元格和有鱼店的单元格都是道路。

        求他到达鱼店所需的最小前踢数

思路:

     参考最短路的思路,使用堆和广度优先搜索,记录每个点的前踢数,如有更新点的前踢数放入堆中。(数据结构,贪心,广搜)

实现:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MX = 1e9;
ll h,w,x1,yy,x2,y2;
vector<array<int,2>> direct(4);
struct cmp{
	bool operator()(array<int,3> x,array<int,3> y){
		return y[0]<x[0];
	}
};
void solve(){
	direct[0] = {0,1};
	direct[1] = {1,0};
	direct[2] = {0,-1};
	direct[3] = {-1,0};
	cin>>h>>w;
	vector<vector<char>> maze(h+1,vector<char>(w+1));
	vector<vector<int>> vis(h+3,vector<int>(w+3,INT_MAX));
	for (int i=1;i<=h;i++){
		for (int j=1;j<=w;j++){
			cin>>maze[i][j];
		}
	}
	cin>>x1>>yy>>x2>>y2;
	vis[x1][yy] = 0;
	priority_queue<array<int,3>,vector<array<int,3>>,cmp> pq;
	pq.push({0,x1,yy});
	while (!pq.empty()){
		int val = pq.top()[0],x = pq.top()[1],y = pq.top()[2];
		pq.pop();
		for (auto& i:direct){
			int now_x = x+i[0],now_y = y+i[1],tmp_x = x+2*i[0],tmp_y = y+2*i[1];
			if (now_x<=h && now_x>=1 && now_y<=w && now_y>=1){
				if (maze[now_x][now_y]=='#'){
					if (vis[now_x][now_y]>val+1){
						pq.push({val+1,now_x,now_y});
						vis[now_x][now_y] = val+1;
					}
					if (tmp_x<=h && tmp_x>=1 && tmp_y<=w && tmp_y>=1){
						if (vis[tmp_x][tmp_y]>val+1){
							pq.push({val+1,tmp_x,tmp_y});
							vis[tmp_x][tmp_y] = val+1;
						}
					}
				}else{
					if (vis[now_x][now_y]>val){
						pq.push({val,now_x,now_y});
						vis[now_x][now_y] = val;
					}
					if (tmp_x<=h && tmp_x>=1 && tmp_y<=w && tmp_y>=1){
						if (maze[tmp_x][tmp_y]=='#'){
							if (vis[tmp_x][tmp_y]>val+1){
								pq.push({val+1,tmp_x,tmp_y});
								vis[tmp_x][tmp_y] = val+1;
							}
						}else{
							if (vis[tmp_x][tmp_y]>val){
								pq.push({val,tmp_x,tmp_y});
								vis[tmp_x][tmp_y] = val;
							}	
						}
					}
				}
			}
		}
	}
	cout<<vis[x2][y2]<<endl;
}

int main(){
    // 鍏抽棴杈撳叆杈撳嚭娴佸悓姝?
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    // 涓嶄娇鐢ㄧ瀛﹁鏁版硶
    // cout<<fixed;
    // 鍥涜垗浜斿叆涓棿濉繚鐣欏嚑浣嶅皬鏁帮紝涓嶅~榛樿
    // cout.precision();
	solve();	
    return 0;
}

E - Ringo's Favorite Numbers 3

翻译:

        当且仅当正整数 N 同时满足以下两个条件时,它是一个 400 数:

  • N 恰好有 2 个不同的质因数。
  • 对于 N 的每个质因数 p,p 平分 N 的次数是偶数。更正式地说,能使 p k 除以 N 的最大非负整数 k 是偶数。

        处理 Q 个查询。每个查询都会给出一个整数 A,因此请找出不超过 A 的最大 400 个数。在此问题的限制条件下,不超过A 的 400 个数总是存在的。

思路:

        先预处理,先求出1e6内的质数,再求出这些质数能得到的值(<=1e12),在求组合中使用剪枝(两质数相乘>1e6不可行),否则超时。通过去除。

        在每次询问中使用二分求解答案即可。这题也要注意边界条件。(深搜,数论)

实现:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MX = 1e6+10;
const ll MXX = 1e12+10;
ll a;
vector<ll> num(MX,0),prime,ans; 
void init(){
	for (ll i=2;i<MX;i++){
		if (!num[i]){
			prime.push_back(i);
			for (ll j=i+i;j<MX;j+=i){
				 num[j] = 1;
			}
		}
	}
	ll n = prime.size();
	for (ll i=0;i<n;i++){
		for (ll j=i+1;j<n;j++){
			ll p = prime[i],q = prime[j];
			if (p*q>MX) break;
			p*=p,q*=q;
			// cnt number based on p,q
			auto dfs = [&](auto&&dfs,ll x,ll y)->void{
				if (x*y<=MXX){
					ans.push_back(x*y);
					if (x<=MXX/y/p){
						dfs(dfs,x*p,y);
					} 
					if (y<=MXX/x/q){
						dfs(dfs,x,y*q);
					} 
				}
			};
			dfs(dfs,p,q);
		}
	}
	sort(ans.begin(),ans.end());
	ans.erase(unique(ans.begin(),ans.end()),ans.end());
}
void solve() {
    cin>>a;
    cout<<ans[upper_bound(ans.begin(),ans.end(),a)-ans.begin()-1]<<endl;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    init(); 
    ll q;cin>>q;
    while (q--) solve();
	return 0;
}

  有建议可以评论,我会积极改进qwq。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flask+Vue构建图书管理系统及Echarts组件的使用

教程视频链接从零开始FlaskVue前后端分离图书管理系统 后端 项目下载地址 其中venv为该项目的虚拟环境&#xff0c;已安装所有依赖 使用方法&#xff1a; 在pycharm终端中flask create一下&#xff08;因为写了一个自定义命令的代码&#xff09;&#xff0c;初始化books数据…

【项目管理】第2章 信息技术发展 --知识点整理

Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 对应:第1章-第5章 (二)知识笔记 二、信息技术的发展 1. 信息技术及其发展 1)计算机软硬件 计算机硬件由电子机械、光电元件等组成的物理装置,提供物质基础给计算机软件运行。软件包括程…

4-c语言中的数据类型

一.C 语⾔中的常量 1.生活中的数据 整数&#xff1a; 100,200,300,400,500 小数: 11.11 22.22 33.33 字母&#xff1a; a&#xff0c;b&#xff0c;c&#xff0c;d A&#xff0c;B&#xff0c;C&#xff0c;D 在 C 语⾔中我们把字⺟叫做字符. 字符⽤单引号引⽤。例如A’ 单词…

LORA+llama模型微调全流程

LORAllama.cpp模型微调全流程 准备阶段 1.下载基础大模型 新建一个download.py脚本 from modelscope import snapshot_download#模型存放路径 model_path /root/autodl-tmp #模型名字 name itpossible/Chinese-Mistral-7B-Instruct-v0.1 model_dir snapshot_download(na…

Spring 执行流程(源码)

我们对SpringApplication中的run()方法内部进行一些简单的分析 1. //记录一下程序启动开始的事件&#xff0c;用于之后的统计耗时 long startTime System.nanoTime(); //通过调用SpringApplication的**createBootstrapContext()**方法&#xff0c;创建**bootstrapContext**…

安装完 miniconda3 ,cmd无法执行 conda 命令

提示&#xff1a;安装 miniconda3 文章目录 前言一、安装二、安装完&#xff0c;cmd 无法执行 conda 前言 提示&#xff1a;版本 系统&#xff1a;win10 codna: miniconda3 安装完 miniconda3 &#xff0c;cmd无法执行 conda 命令 提示&#xff1a;以下是本篇文章正文内容&am…

Docker快速安装MongoDB并配置主从同步

目录 一、创建相关目录及授权 二、下载并运行MongoDB容器 三、配置主从复制 四、客户端远程连接 五、验证主从同步 六、停止和恢复复制集 七、常用命令 一、创建相关目录及授权 创建主节点mongodb数据及日志目录并授权 mkdir -p /usr/local/mongodb/mongodb1/data mkdir …

Golang系列 - 内存对齐

Golang系列-内存对齐 常见类型header的size大小内存对齐空结构体类型参考 摘要: 本文将围绕内存对齐展开, 包括字符串、数组、切片等类型header的size大小、内存对齐、空结构体类型的对齐等等内容. 关键词: Golang, 内存对齐, 字符串, 数组, 切片 常见类型header的size大小 首…

网络原理 - HTTP/HTTPS

1. HTTP 1.1 HTTP是什么&#xff1f; HTTP (全称为 “超文本传输协议”) 是⼀种应用非常广泛的应用层协议. HTTP发展史&#xff1a; HTTP 诞生于1991年. 目前已经发展为最主流使用的⼀种应用层协议 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经…

OCC Shape 操作

#pragma once #include <iostream> #include <string> #include <filesystem> #include <TopoDS_Shape.hxx> #include <string>class GeometryIO { public:// 加载几何模型&#xff1a;支持 .brep, .step/.stp, .iges/.igsstatic TopoDS_Shape L…

深度学习入门(四):误差反向传播法

文章目录 前言链式法则什么是链式法则链式法则和计算图 反向传播加法节点的反向传播乘法节点的反向传播苹果的例子 简单层的实现乘法层的实现加法层的实现 激活函数层的实现ReLu层Sigmoid层 Affine层/SoftMax层的实现Affine层Softmax层 误差反向传播的实现参考资料 前言 上一篇…

Linux:页表详解(虚拟地址到物理地址转换过程)

文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中&#xff0c;我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁&#xff0c;然而对于具体的转换实现…

PostgreSQL 一文从安装到入门掌握基本应用开发能力!

本篇文章主要讲解 PostgreSQL 的安装及入门的基础开发能力,包括增删改查,建库建表等操作的说明。navcat 的日常管理方法等相关知识。 日期:2025年4月6日 作者:任聪聪 一、 PostgreSQL的介绍 特点:开源、免费、高性能、关系数据库、可靠性、稳定性。 官网地址:https://w…

WEB安全--内网渗透--LMNTLM基础

一、前言 LM Hash和NTLM Hash是Windows系统中的两种加密算法&#xff0c;不过LM Hash加密算法存在缺陷&#xff0c;在Windows Vista 和 Windows Server 2008开始&#xff0c;默认情况下只存储NTLM Hash&#xff0c;LM Hash将不再存在。所以我们会着重分析NTLM Hash。 在我们内…

8.用户管理专栏主页面开发

用户管理专栏主页面开发 写在前面用户权限控制用户列表接口设计主页面开发前端account/Index.vuelangs/zh.jsstore.js 后端Paginator概述基本用法代码示例属性与方法 urls.pyviews.py 运行效果 总结 欢迎加入Gerapy二次开发教程专栏&#xff01; 本专栏专为新手开发者精心策划了…

室内指路机器人是否支持与第三方软件对接?

嘿&#xff0c;你知道吗&#xff1f;叁仟室内指路机器人可有个超厉害的技能&#xff0c;那就是能和第三方软件 “手牵手” 哦&#xff0c;接下来就带你一探究竟&#xff01; 从技术魔法角度看哈&#xff1a;好多室内指路机器人都像拥有超能力的小魔法师&#xff0c;采用开放式…

从代码上深入学习GraphRag

网上关于该算法的解析都停留在大概流程上&#xff0c;但是具体解析细节未知&#xff0c;由于代码是PipeLine形式因此阅读起来比较麻烦&#xff0c;本文希望通过阅读项目代码来解析其算法的具体实现细节&#xff0c;特别是如何利用大模型来完成图谱生成和检索增强的实现细节。 …

【Redis】通用命令

使用者通过redis-cli客户端和redis服务器交互&#xff0c;涉及到很多的redis命令&#xff0c;redis的命令非常多&#xff0c;我们需要多练习常用的命令&#xff0c;以及学会使用redis的文档。 一、get和set命令&#xff08;最核心的命令&#xff09; Redis中最核心的两个命令&…

微前端随笔

✨ single-spa&#xff1a; js-entry 通过es-module 或 umd 动态插入 js 脚本 &#xff0c;在主应用中发送请求&#xff0c;来获取子应用的包&#xff0c; 该子应用的包 singleSpa.registerApplication({name: app1,app: () > import(http://localhost:8080/app1.js),active…

C++中的浅拷贝和深拷贝

浅拷贝只是将变量的值赋予给另外一个变量&#xff0c;在遇到指针类型时&#xff0c;浅拷贝只会把当前指针的值&#xff0c;也就是该指针指向的地址赋予给另外一个指针&#xff0c;二者指向相同的地址&#xff1b; 深拷贝在遇到指针类型时&#xff0c;会先将当前指针指向地址包…