ABC300

news2024/11/27 14:50:49

ABC300E

题面

思路

对于投骰子,最后一步可能得到1、2、3、4、5、6,那么对应的最后一步之前的数是n/1、n/2、n/3、n/4、n/5,n/6。并且每个数字(1、2、3、4、5、6)得到的概率是一样的,即为1/6。

也就是F(n)=(1/6)(F(n/1)+F(n/2)+F(n/3)+F(n/4)+F(n/5)+F(n/6))*{只有n%4==0,F(n/4)才能产生贡献,其余同理}

移项得:F(n)=1/5(F(n/1)+F(n/2)+F(n/3)+F(n/4)+F(n/5)),如果一位数组能开下,就可以直接线性dp进行状态转移,但是这个n<=1e18,所以用记忆化搜索的方式实现dp,记录mp[x]为得到x的概率,由于在取模过程中进行了/5操作,所以求一下5在 mod 99824435意义下的乘法逆元即可

细节:mp[x]在调用之前如果不存在会创建mp[x]=0,对记忆化搜索的过程有影响,所以记忆化x是否保存结果的时候应该使用mp.count(x)

代码;

ABC300F

题面

#include <bits/stdc++.h>
using namespace std;

#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define PII pair<int, int>
#define de(a) cout << #a << " = " << a << "\n";
#define deg(a) cout << #a << " = " << a << " ";
#define endl "\n"
#define int long long
#define LL long long
const int mod = 998244353;
const int N = 1e6 + 5;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};

int POW(int a, int b)
{
	int res = 1;
	while (b)
	{
		if (b & 1)
			res *= a;
		a *= a;
		res %= mod;
		a %= mod;
		b >>= 1;
	}
	res %= mod;
	return res;
}
map<int, int> mp;

int dp(int n, int inv)
{
	if (mp.count(n))
		return mp[n];

	int ans = 0;
	for (int i = 2; i <= 6; i++)
	{
		if (n % i == 0)
		{
			ans += dp(n / i, inv);
			ans % +mod;
		}
	}
	mp[n] = ans * inv % mod;
	return mp[n];
}

void solve()
{
	int inv = POW(5, mod - 2);
	int n;
	cin >> n;
	mp[1] = 1;
	cout << dp(n, inv);
}

signed main()
{
	FAST;
	int t = 1;
	// cin >> t;
	while (t--)
		solve();

	return 0;
}

思路

先抛出结论:起点一定在1-N某个点(假设字符串第一个字符的下标为1)

证明:首先T是由M个S串拼接而成,假设最优方案具有从第N+1或者更晚的某个字符开始的最长连续的o,然后对于第i个字符,我们决定使用第i-N个字符去替代它(他们是相同的,在不考虑修改的情况下,而且这种情况必定存在,因为i>=N+1)。

得到这个结论之后,就可以O(N)枚举起点,那怎么得到终点呢?

??暴力枚举,从i(1<=i<=N)开始,枚举j(N<=j<=NM)直到i-j这个区间内的x的个数大于k停止,此时答案即为j-i+1 (i-j范围内的x最多出现k次)。思路没错,但是这样跑直接T飞。

写到这一步就可以二分了,sum[i]表示从1-i这个区间内x的个数是多少。只需要求出1-N的即可,因为后面的NM-N个字符,每N个都与前1-N个字符相同,那对于一个大于N的下标i可以这样得到1-i中的x的个数

int f(int x, int n, vector<int> &rw) // 返回从1-x有多少个x
{//x为终点下表,n即为上文的N,也就是S串的长度,rw是前缀和数组,rw[i]代表1-i有多少个x
	int res = (x / n) * rw[n];
	int rem = x % n;
	res += rw[rem];
	return res;
}

总结:

枚举起点i(1<=i<=N),二分终点j(i<=j<=NM),[i,j]这个闭区间中x的个数<=k

代码:

#include <bits/stdc++.h>
using namespace std;

#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define PII pair<int, int>
#define de(a) cout << #a << " = " << a << "\n";
#define deg(a) cout << #a << " = " << a << " ";
#define endl "\n"
#define int long long
#define LL long long
const int mod = 1e9 + 7;
const int N = 1e6 + 5;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};

int f(int x, int n, vector<int> &rw) // 返回从1-x有多少个x
{
	int res = (x / n) * rw[n];
	int rem = x % n;
	res += rw[rem];
	return res;
}

void solve()
{
	int n, m, k;
	cin >> n >> m >> k;
	string s;
	cin >> s;
	vector<int> rw(n + 1, 0);
	for (int i = 0; i < n; i++)
	{
		rw[i + 1] = rw[i];
		if (s[i] == 'x')
			rw[i + 1]++;
	}

	int res = 0;
	for (int i = 1; i <= n; i++)
	{
		int fbeg = f(i - 1, n, rw); // 1-i-1位置有多少x
		int l = i, r = n * m;
		while (l <= r)
		{
			int mid = l + r >> 1;
			if (f(mid, n, rw) - fbeg <= k)
			{
				// f(mid, n, rw) - fbeg从i-mid有多少x
				l = mid + 1;
			}
			else
			{
				r = mid - 1;
			}
		}
		res = max(r - i + 1, res);
	}
	cout << res << endl;
}

signed main()
{
	FAST;
	int t = 1;
	// cin >> t;
	while (t--)
		solve();

	return 0;
}

ABC300G

参考:AtCoder Beginner Contest 300——A-G题讲解atcoder比赛阿史大杯茶的博客-CSDN博客

官方题解:Editorial - UNIQUE VISION Programming Contest 2023 Spring(AtCoder Beginner Contest 300)

#include <bits/stdc++.h>
using namespace std;

#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define PII pair<int, int>
#define de(a) cout << #a << " = " << a << "\n";
#define deg(a) cout << #a << " = " << a << " ";
#define endl "\n"
#define int long long
#define LL long long
const int mod = 1e9 + 7;
const int N = 1e6 + 5;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};

int n, p;

void push(vector<int> &a, int num) // 将与num结合合法的数全部加进来
{
	int sz = a.size();
	for (int i = 0; i < sz; i++)
	{
		int t = a[i];
		while (1)
		{
			t *= num;
			if (t > n)
				break;
			a.push_back(t);
		}
	}
}

void solve()
{
	vector<int> prime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};

	cin >> n >> p;

	while (p < prime.back()) // 将大于p的质因数删去
		prime.pop_back();

	vector<int> frt = {1}, bck = {1};
	for (auto &c : prime)
	{
		if (frt.size() < bck.size())
			push(frt, c); // 采用这种方式降低push函数里面的时间复杂度
		else
			push(bck, c);
	}

	sort(frt.begin(), frt.end());
	sort(bck.begin(), bck.end());
	int res = 0;
	for (int i = 0, j = bck.size() - 1; i < frt.size(); i++) // 双指针找合法数
	{
		int left = n / frt[i];
		while (j >= 0 && left < bck[j])
			j--;
		if (j < 0)
			break;
		res += j + 1;
	}
	cout << res << endl;
}

signed main()
{
	FAST;
	int t = 1;
	// cin >> t;
	while (t--)
		solve();

	return 0;
}

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

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

相关文章

Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)

1.简介 在实际工作中&#xff0c;我们经常会听到数据库的性能和稳定性等等&#xff0c;这些有时候也需要测试工程师去评估和测试&#xff0c;上一篇文章主要介绍了jmeter连接和创建数据库测试计划的过程,在文中通过示例和代码非常详细地介绍给大家&#xff0c;希望对各位小伙伴…

cpolar的基础使用方法

如何使用cpolar内网穿透&#xff1f; 文章目录 如何使用cpolar内网穿透&#xff1f;前言1. 在群辉NAS系统下安装cpolar套件2. 管理隧道列表3. 创建固定数据隧道 前言 群晖作为大容量存储系统&#xff0c;既可以作为个人的私有存储设备&#xff0c;也可以放在小型企业中作为数据…

别再用人工巡检了,教你一个简单好用的新技巧

当今社会中&#xff0c;计算机设备扮演着不可或缺的角色&#xff0c;它们在个人生活、商业活动和科技创新中都具有重要地位。 无论是个人用户还是企业&#xff0c;UPS监控都是确保计算机设备稳定运行的关键环节。通过有效的UPS监控&#xff0c;我们能够在电力波动或中断时保护硬…

python中的迭代器和生成器

一、迭代器 支持迭代的容器&#xff0c;如列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、字典&#xff08;dict&#xff09;、集合&#xff08;set&#xff09;这些序列式容器。 自定义迭代器的类中必须实现以下2个方法&#xff1a; __next__(self)…

Netty:用forEachByte遍历处理ByteBuf中的可读字节

说明 io.netty.buffer.ByteBuf的forEachByte(ByteProcessor processor)用指明的ByteProcessor 遍历ByteBuf中的可读字节。遍历的时候用升序遍历。 -这个函数可以在ByteBuf中寻找某个字节首次出现的位置&#xff0c;或者首次不是某个字节的位置。 如果已经遍历完了可读字节但还…

简单的基于SpringBoot的学生成绩管理系统java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 简单的基于SpringBoot的学生成绩管理系统 系统有2权限…

LeetCode面向运气之Javascript—第26题-删除有序数组中的重复项-99.18%

LeetCode第26题-删除有序数组中的重复项 题目要求 一个升序排列的数组nums &#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素只出现一次 &#xff0c;返回删除后数组的新长度。元素的相对顺序应该保持 一致 。然后返回 nums 中唯一元素的个数。 原地 说是一个…

领航优配:股市看盘的几个小技巧?

股市看盘是每个股民不可或缺的一项技能&#xff0c;它能够帮助股民更好地剖析股票的走势&#xff0c;从而做出更明智的出资决策。可是&#xff0c;股市行情千变万化&#xff0c;要想达到精准的猜测与判断&#xff0c;需求把握一些小技巧。本文将分享几个股市看盘的小技巧&#…

使用CANape查看blf数据

blf数据不像mf4那样自带信号数据库&#xff0c;因为它是记日志用的&#xff0c;一般情况下要尽可能的小&#xff0c;所以&#xff0c;解析blf数据要单独有个数据库文件&#xff0c;一般是dbc或者arxml&#xff0c;我这里用dbc做示范&#xff0c;解析之前要先加载dbc&#xff0c…

微服务Ribbon-负载均衡策略和饥饿加载

目录 一、负载均衡策略 1.1 负载均衡策略介绍 1.2 自定义负载均衡策略 二、饥饿加载 &#xff08;笔记整理自bilibili黑马程序员课程&#xff09; 一、负载均衡策略 1.1 负载均衡策略介绍 负载均衡的规则都定义在IRule接口中&#xff0c;而IRule有很多不同的实现类&…

HCIP-linux和kvm(ks配置文件自动化安装及console连虚拟机有问题)

1、linux linux安装教程参考&#xff0c;https://blog.51cto.com/cloudcs/5245337 yum源配置 本地yum源配置&#xff1a; 8版本配置&#xff1a;将光盘iso挂载到某个目录&#xff0c;/dev/cdrom是/dev/sr0软链接&#xff0c;# mount /dev/cdrom /mnt&#xff0c;# ls /mnt Ap…

siMLPe:Human Motion Prediction

Back to MLP: A Simple Baseline for Human Motion Prediction解析 摘要1. 简介2. Related Work2.1 基于RNN的人体运动预测2.2 基于GCN的人体运动预测2.3 基于 Attention 的人类运动预测2.4 总结 3. siMLPe3.1 离散余弦变换&#xff08;Discrete Cosine Transform (DCT)&#x…

使用go获取链上数据之主动拉取-连接数据库

上一篇文章&#xff0c;我们完成了基础环境的搭建&#xff0c;并通过viper完成了配置文件的读取&#xff0c;本章&#xff0c;我们将要完成使用gorm连接数据库&#xff0c;并插入一条数据 1、配置数据库连接 1.1、新建db.go 对数据库的操作&#xff0c;我们使用的是gorm类库&…

个人理解Java的浅克隆与深克隆

浅克隆 浅克隆只会克隆基本数据属性&#xff0c;而不会克隆引用其他对象的属性&#xff0c;String类型除外。&#xff08;String对象是不可修改的对象&#xff0c;每次修改其实都是新建一个新的对象&#xff0c;而不是在原有的对象上修改&#xff0c;所以当修改String属性时其…

vue2.7如何使用vue-i18n

版本&#xff1a; vue&#xff1a;2.7.0 vue-i18n&#xff1a;8.28.2 一、下载 npm i vue-i18n8.28.2二、新建 新建一个文件&#xff0c;例如&#xff1a;lang&#xff0c;项目结构如下&#xff1a; index.js&#xff1a; import Vue from vue import VueI18n from vue-i18n…

函数的递归

1、什么是递归&#xff1f; 程序调用自身的编程技巧称为递归。 递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#x…

最强自动化测试框架Playwright-操作指南(3)-PO模式

playwright支持PO模式 创建页面对象 class SearchPage:def __init__(self, page):self.page pageself.search_term_input page.get_by_role("searchbox", name"输入搜索词")def navigate(self):self.page.goto("https://bing.com")def searc…

《人脸识别技术应用安全管理规定(征求意见稿)》,需要关注三个焦点

目录 严防人脸信息采集与滥用 规范人脸识别信息的处理 保障人脸识别技术的安全 人脸识别主要有三类风险 近日&#xff0c;国家互联网信息办公室发布《人脸识别技术应用安全管理规定&#xff08;试行&#xff09;&#xff08;征求意见稿&#xff09;》公开征求意见的通知。 …

甄品焕新|燕千云服务请求预警功能上线,燕小千AIGC能力再升级

​ 燕千云数智化业务服务平台发布了1.23.0版本&#xff0c;此次版本上线了服务请求预警功能&#xff0c;增加呼叫中心服务场景中的通话质检功能&#xff0c;提高了企业IT服务效率。此次还升级了燕小千AIGC能力&#xff0c;不仅可以实时预估文档学习时间&#xff0c;还可以一键分…

multi-head_seft-attention(多头自注意力)

对比 相比于single-head&#xff0c;multi-head就是将 q i q^i qi分成了 h h h份 multi-head_seft-attention的计算过程 将 q i q^i qi分成了 h h h份 计算过程 对于每个Head&#xff0c;我们可以提取出他的 b 11 b_{11} b11​到 b m 1 b_{m1} bm1​&#xff0c;以 H e…