第五届湖北省大学生程序设计竞赛(HBCPC 2023)vp赛后补题

news2024/11/24 3:47:51

Problem - B - Codeforces

思路:

  1. 数位dp,如果我们暴力的计算的状态的话,显然就是记录每个数字出现几次。但是显然这样难以发挥数位dp的记忆化功效,因为只有出现次数相同,你是什么数字,实际是无所谓的。所以我们尝试记录每个出现次数有多少个数字
  2. 尝试打表发现,结果只有1477种
  3. int ans;
    
    void dfs(int i,int cnt,int sum)//i为出现i次,cnt录入几个不同的数字,sum为选的i的和
    {
    	if(sum>18)return;
    	if(cnt>10)return;
    	if(i==19)
    	{
    		ans++;
    		return;
    	}
    	for(int j=0; j<=18/i; ++j)//j为出现i次有j个数
    	{
    		dfs(i+1,cnt+j,sum+j*i);
    	}
    }
    
    void mysolve()
    {
    	dfs(1,0,0);
    	cout<<ans<<endl;
    }
  4. 所以,对于每个数字出现的状态,我们可以用每个出现次数有几个数字这个状态来记录
  5. 接下来就是普通的数位dp(记得处理前导0问题)
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int ll
const int N = 20;
int dp[N][2000],bit[N];
map<vector<int>,int>mp;
int cnt;

//状态打表
//int ans;
//
//void dfs(int i,int cnt,int sum)//i为出现i次,cnt录入几个不同的数字,sum为选的i的和
//{
//	if(sum>18)return;
//	if(cnt>10)return;
//	if(i==19)
//	{
//		ans++;
//		return;
//	}
//	for(int j=0; j<=18/i; ++j)//j为出现i次有j个数
//	{
//		dfs(i+1,cnt+j,sum+j*i);
//	}
//}
//
//void mysolve()
//{
//	dfs(1,0,0);
//	cout<<ans<<endl;
//}

int dfs(int len,vector<int>a,bool limit,bool zero)
{
	if(!len)return *max_element(a.begin(),a.end());
	vector<int>p(20);
	for(auto v:a)if(v)p[v]++;//将a数组状态转为每个出现次数有几个数字的状态,用map存储对应的数组
	if(!mp[p])mp[p]=++cnt;
	int sta=mp[p];
	if(!limit&&dp[len][sta]!=-1)return dp[len][sta];
	int ans=0;
	int top=limit?bit[len]:9;
	for(int i=0; i<=top; ++i)
		{
			vector<int>tmp=a;
			if(i||len==1||!zero)tmp[i]++;//zero判断前导零问题
			ans+=dfs(len-1,tmp,limit&&i==top,(!i)&&zero);
		}
	if(!limit)return dp[len][sta]=ans;//存储无限制下的状态
	return ans;
}

int cal(int x)//把数字x按位存储到数组
{
	if(x<0)return 0;
	if(x==0)return 1;//可能要特判0与负数的贡献
	int len=0;
	while(x)bit[++len]=x%10,x/=10;
	return dfs(len,vector<int>(10),1,1);
}

void mysolve()
{
	int l,r;
	cin>>l>>r;
	cout<<cal(r)-cal(l-1)<<endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//使用read请把解绑注释了
	int t=1;
	cin >> t;
	//read(t);
	memset(dp,-1,sizeof(dp));
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

Problem - I - Codeforces

思路:

  1. 显然首先答案可以转化为求取最小的x使得x*(x+1)%(lcm*2)==0
  2. 容易发现x与x+1互质,又因为lcm可以分解为其质因子的乘积(形如lcm=p1^n1*p2^n2...pi^ni)
  3. 因为x与x+1互质,显然我们他们不能拥有相同的lcm的因子
  4. 那么问题转化为,lcm把因子分为a,b两部分(显然要求a,b互质,不拥有相同的因子),问是否存在ax+1=by(即原来的x+1=x+1)。(x,y为未知数)
  5. 这个形式观察出实际是exgcd(-ax+by=1),所以答案转化为,枚举各个因子的组合a与b,求a的逆元x,那么-ax就是我们要求的(x*(x+1)%(lcm*2)==0)。我们求出最小的-ax
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
const int N = 3e5 + 10;
const int mod = 998244353;

bool vis[N];
int ou[N];

void oula(int n)
{
	for(int i=2; i<=n; ++i)
		{
			if (!vis[i])
				{
					vis[i] = 1;
					ou[++ou[0]] = i;//ou[0]是目前素数个数
				}
			for (int j = 1; j <= ou[0] && 1ll*i*ou[j]<= n; ++j)
				{
					vis[i * ou[j]] = 1;//每个数由其最大质因子筛去
					if (i % ou[j] == 0)break;//避免重复筛去(i*ou[j+1]=k*ou[j]*ou[j+1]=t*ou[j+1]),后面自然会出现t帮忙筛去这个t*ou[j+1]
				}
		}
}

void exgcd(ll a, ll b, ll &x, ll &y)//&直接修改值
{
	if (!b)x = 1, y = 0;
	else
		{
			exgcd(b, a % b, y, x);//x继承了深层的y,y就继承深层的x,y再减去(a/b)*y2即-(a/b)*x即可
			y -= (a / b) * x;
		}
}

vector<int>v;
ll ans=INF;
void dfs(int i,ll res,ll sum)//dfs暴力枚举因子组合
{
	if(i==(int)v.size())
		{
			ll a=res,b=sum/res,x,y;
			exgcd(a, b, x, y);
			x = ( -x + b) % b;//保证逆元为正数,这里x取的是-x(-ax),但是要求-ax>0
			if(x)ans=min(ans,x*a);
			else ans=min(ans,sum);//特判res=1,此时模数为1,x必为0
			return;
		}
	dfs(i+1,res*v[i],sum*v[i]);
	dfs(i+1,res,sum*v[i]);
}

void mysolve()
{
	oula(1e4);
	int n,x;
	cin>>n;
	map<int,int>mp;
	for(int i=1; i<=n; ++i)
		{
			cin>>x;
			for(int i=1; i<=ou[0]&&1ll*ou[i]<=x; ++i)
				{
					if(x%ou[i]==0)
						{
							int cnt=0;
							while(x%ou[i]==0)cnt++,x/=ou[i];
							mp[ou[i]]=max(mp[ou[i]],cnt);
						}
				}
			if(x>1)
				{
					mp[x]=max(mp[x],1);
				}
		}
	mp[2]++;
	for(auto [k,val]:mp)//求出lcm的因子
		{
			int res=1;
			for(int i=1; i<=val; ++i)res=1ll*res*k;
			v.push_back(res);
		}
	dfs(0,1,1);
	cout<<ans<<endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//使用read请把解绑注释了
	int t=1;
	//cin >> t;
	//read(t);
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

Problem - J - Codeforces

思路:

  1. 我们可以贪心的前往前方资源更大的,显然资源最大的留最久最好,所以每个点都是尽可能快的前往下一个比当前资源大的点
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define eps 1e-9
#define int              long long
typedef pair<int, int> pii;
inline int read(int &x);
//double 型memset最大127,最小128
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
const int N = 3e5 + 10;
const int mod = 998244353;
int a[N],b[N];
ll sum[N];
void mysolve()
{
	int n;
	cin>>n;
	for(int i=1; i<=n; ++i)cin>>a[i],sum[i]=a[i]+sum[i-1];
	if(sum[n]<0||sum[1]<0)
		{
			cout<<-1<<endl;
			return;
		}
	int ans=n,res=sum[1];//首先,每个都是要经过一次,答案>=n
	ll mx=sum[1];//枚举当前使用的资源最大点
	for(int i=1; i<n; ++i)
		{
			mx=max(sum[i],mx);
			if(res+sum[i+1]<0)
				{
					if(mx<=0)
						{
							cout<<-1<<endl;
							return;
						}
					int cnt=(-(res+sum[i+1])+mx-1)/mx;
					ans+=cnt;
					res+=sum[i+1]+cnt*mx;
				}
			else res+=sum[i+1];
		}
	cout<<ans<<endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//使用read请把解绑注释了
	int t=1;
	//cin >> t;
	//read(t);
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

Problem - K - Codeforces

思路:

  1. 观察出,打败n个人与一个一个人打败是相互独立的,且状态相同,即每个人都是独立且相同的
  2. 所以我们只需要讨论跟一个人打输的概率,那么答案就是n方
  3. 假设当前n+1人的骰子固定是k,那么他第一局输的概率是(m-k)/m,第二局是(m-k)/(m*m)...第n局是(m-k)/(m^n),合并得到(m-k)*\sum_{i=1 }^{+\propto}\frac{1}{m^{ i }}=\frac{m-k}{m-1}(等比求和)
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define eps 1e-9
#define int              long long
typedef pair<int, int> pii;
inline int read(int &x);
//double 型memset最大127,最小128
//---------------------------------------------------------------------------------------------------------------------//
//---------------------------------------------------------------------------------------------------------------------//
const int N = 3e5 + 10;
const int mod = 998244353;
ll fastmi(ll base, ll power)
{
	ll ans = 1;
	while (power)
		{
			if (power & 1)ans=ans*base%mod;
			base=base*base%mod;
			power >>=1;
		}
	return ans;
}

void mysolve()
{
	int n,m;
	cin>>n>>m;
	int inv=fastmi(m-1,mod-2);
	for(int i=1; i<=m; ++i)
		{
			int res=(m-i)*inv%mod;
			cout<<fastmi(res,n)<<" ";
		}
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//使用read请把解绑注释了
	int t=1;
	//cin >> t;
	//read(t);
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

inline int read(int &x)
{
	x = 0;
	char ch = 0;
	while (ch < '0' || ch > '9')ch = getchar();
	while (ch >= '0' && ch <= '9')
		{
			x = x * 10 + ch - '0';
			ch = getchar();
		}
	return x;
}

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

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

相关文章

I2C学习笔记——I2C协议学习

1、I2C简介&#xff1a;一种简单、双线双向的同步串行总线&#xff0c;利用串行时钟线(SCL)和串行数据线(SDA)在连接总线的两个器件之间进行信息传递&#xff1b; 数据传输是通过对SCL和SDA线高低电平时序的控制&#xff0c;来产生I2C总线协议所需要的信号。在总线空闲状态时&a…

【Linux C】基于树莓派/香橙派的蓝牙服务端——支持多蓝牙设备接入

一、需求 在树莓派/香橙派上利用开发板自带的蓝牙作为一个蓝牙服务端&#xff08;主机&#xff09;&#xff0c;允许外来设备&#xff08;从机&#xff09;通过蓝牙接入进行通信&#xff0c;通信格式为透传方式&#xff1b;采用的编程语言为Linux C 二、环境准备 bluez安装 …

三波混频下的相位失配原理

原理推导 在四波混频情况下&#xff0c;实现零相位失配是一件很困难的事情。因为在四波混频中&#xff0c;相位调制和增益都依赖于相同的参数&#xff0c;即克尔非线性 γ \gamma γ。这个问题可以用嵌入在传输线上的辅助共振元件的复杂色散工程来部分解决。 但是在三波混频中…

ceph集群监控

文章目录 Ceph Dashboard启用dashboard插件dashboard启用ssl Promethues监控ceph启用prometheus模块配置prometheus采集数据grafana数据展示 Ceph Dashboard ceph-dashboard官方介绍&#xff1a;https://docs.ceph.com/en/latest/mgr/dashboard/ Ceph Dashboard是一个内置的c…

数据库系统概论---选择题刷题实训

&#xff08;一&#xff09;选择题 1.下列选项中&#xff0c;不属于关系模型三要素的是&#xff08; C &#xff09; A&#xff0e;数据结构 B&#xff0e;数据操纵 C&#xff0e;数据安全 D&#xff0e;数据完整性规则 2.保证数据库…

【Spring】透过Spring源码查看Bean的命名转换规则

近期在写Spring项目的时候&#xff0c;需要通过注解的形式去替代之前直接将Bean存放在Spring容器这种方式&#xff0c;以此来简化对于Bean对象的操作&#xff0c;但是这样无法通过准确的Id去获取到相应的Bean对象了 测试观察 首先&#xff0c;如果要将指定的对象存放到Spring中…

SQL注入基础知识

文章目录 一、注入的分类1.基于服务器收到的响应2.基于处理输入的SQL查询&#xff08;数据类型&#xff09;3.基于程度和顺序的注入&#xff08;哪里受了影响&#xff09;4、基于注入点位置 二、系统函数1.字符串连接函数2.一般用于尝试的语句3.union操作符的介绍 总结 一、注入…

caught (in promise) RangeError: Maximum call stack size exceeded-vue前置导航守卫死循环

报错图 产生场景 1.近期在搭建移动端的架子时&#xff0c;在写路由守卫时&#xff0c;发现陷入死循环&#xff0c;报错意思是循环超出栈。。 2.后面排查了一圈问题之后&#xff0c;发现这个问题很小&#xff0c;但很难发现&#xff0c;在此记录。 3.vue 路由的导航守卫并不是…

类和对象【4】static成员、const对象、友元

全文目录 引言static成员static成员变量static成员函数 const对象友元友元函数友元类 总结 引言 通过前面的三篇文章&#xff0c;相信大家对类和对象已经有了一个基本的认识。 类和对象1&#xff08;初识&#xff09; 类和对象2&#xff08;默认成员函数&#xff09; 类和对象…

数据结构与算法11:堆

目录 【堆】 堆中插入和删除元素 堆排序 【堆的常见应用】 应用1&#xff1a;优先级队列 &#xff08;1&#xff09;合并有序小文件 &#xff08;2&#xff09;定时器功能 应用2&#xff1a;计算排行榜中前K个数据 应用3&#xff1a;求中位数 应用4&#xff1a;计算…

算法基础--MD5算法介绍

1、简介 MD5再开发过程中经常碰到的一种算法&#xff0c;因此感觉有必要对其原理进行更深入的了解一下。 2、算法概念 散列函数&#xff0c;也称作哈希函数&#xff0c;消息摘要函数&#xff0c;单向函数或者杂凑函数。散列函数主要用于验证数据的完整性。通过散列函数&#x…

自然语言处理从入门到应用——自然语言处理的应用任务

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 本文介绍信息抽取、情感分析、问答系统、机器翻译和对话系统等自然语言处理应用任务。这些任务可以直接或间接地以产品的形式为终端用户提供服务&#xff0c;是自然语言处理研究应用落地的主要技术。 信息抽取 信息抽…

天气预报信息获取程序--GUI--可以使用

上次正对项目中需要填写项目日志&#xff0c;制作了一个命令行版本的下载天气信息的程序&#xff0c;满足日常需要&#xff0c;调整一下界面版本的程序 如果大家使用命令行的可以使用下面的版本&#xff08;连接&#xff09; https://ht666666.blog.csdn.net/article/details…

逻辑漏洞学习-知识点总结

逻辑漏洞就是程序在实现业务逻辑上存在的错误&#xff0c;辑漏洞的出现通常是因为程序在设计业务逻辑时考虑不够全面&#xff0c;或者程序员的思维过程存在瑕疵&#xff0c;没有充分考虑到各种可能的情况 大部分程序员在设计的时候&#xff0c;目标是实现功能需求&#xff0c;…

Linux基础知识点 有这篇就足够了!!

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 目录 一、 从认识操作系统开始 1.1 操作系统简介 1.2 操作系统…

chatgpt赋能Python-python分表

介绍 Python是一种流行的编程语言&#xff0c;适用于各种应用程序开发&#xff0c;包括网络应用程序、数据库应用程序以及数据分析和科学计算。Python分表是基于Python编写的分表工具&#xff0c;可以帮助开发人员更轻松地管理大型数据库表格。 Python分表是如何工作的&#…

0219-810

3GPP TS 02.19 V8.1.0 (2005-06) 前言 本技术规范由第三代合作伙伴计划 (3GPP) 制定。 本文件的内容取决于 TSG 的持续工作&#xff0c;并可能在 TSG 正式批准后发生变化。 如果 TSG 修改本文档的内容&#xff0c;TSG 将重新发布 确定发布日期的变化和版本号的增加如下&…

低代码开发平台选择指南:如何选出最适合企业的低代码平台?

低代码平台的兴起改变了公司处理软件开发的方式。这些平台使组织能够快速高效地构建应用程序&#xff0c;该应用程序可以利用预设组件和开箱功能。但是&#xff0c;因为有这么多低代码平台可以使用&#xff0c;所以为你的组织选择合适的平台可能是一个挑战。本文将探索如何低代…

FreeRTOS任务切换

PendSV异常 SVC 用于产生系统函数的调用请求。例如&#xff0c;操作系统不让用户程序直接访问硬件&#xff0c;而是通过提供一些系统服务函数&#xff0c;用户程序使用 SVC 发出对系统服务函数的呼叫请求&#xff0c;以这种方法调用它们来间接访问硬件。因此&#xff0c;当用户…

(字符串 ) 459. 重复的子字符串——【Leetcode每日一题】

❓459. 重复的子字符串 难度&#xff1a;简单 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入: s “…