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

这篇具有很好参考价值的文章主要介绍了第五届湖北省大学生程序设计竞赛(HBCPC 2023)vp赛后补题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

思路:文章来源地址https://www.toymoban.com/news/detail-470308.html

  1. 观察出,打败n个人与一个一个人打败是相互独立的,且状态相同,即每个人都是独立且相同的
  2. 所以我们只需要讨论跟一个人打输的概率,那么答案就是n方
  3. 假设当前n+1人的骰子固定是k,那么他第一局输的概率是(m-k)/m,第二局是(m-k)/(m*m)...第n局是(m-k)/(m^n),合并得到第五届湖北省大学生程序设计竞赛(HBCPC 2023)vp赛后补题(等比求和)
#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;
}

到了这里,关于第五届湖北省大学生程序设计竞赛(HBCPC 2023)vp赛后补题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 河南省第五届“金盾信安杯”网络与数据安全大赛-WP

    师傅们,我太菜了,除了最后一个小时都还在前20名,结果最后一个小时被踢下去了,做了一道少解的题目也掩饰溃败,被打服了,直接被踢出前40名,babyrsa到底怎么解,呜呜!被打服了!!!!!!!以下是我们队伍的10道题目的wp。 题目一 Crypto-我看看谁还不会RSA 操作内容: 看到该题之后发现是

    2024年02月04日
    浏览(43)
  • 【IEEE会议】第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023)

    第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023) 2023 5th International Conference on Frontiers Technology of Information and Computer  第五届信息与计算机前沿技术国际学术会议(ICFTIC 2023)将在中国青岛举行, 会期是2023年11月17-19日, 为期三天, 本次会议是由中国石油大学(华东)主办,

    2024年02月10日
    浏览(57)
  • TPU编程竞赛|Stable Diffusion大模型巅峰对决,第五届全球校园人工智能算法精英赛正式启动!

    目录 赛题介绍 赛题背景 赛题任务 赛程安排 评分机制 奖项设置         近日,2023第五届全球校园人工智能算法精英赛正式开启报名。作为赛题合作方,算丰承办了“算法专项赛”赛道,提供赛题 「面向Stable Diffusion的图像提示语优化」 ,同时为参赛选手提供了丰富的云

    2024年02月08日
    浏览(64)
  • 通付盾受邀出席区块链技术和应用峰会暨第五届中国区块链开发大赛成果发布会及颁奖仪式

    由江苏省工业和信息化厅、中国电子技术标准化研究院联合举办的“标准引领、创新驱动”第五届中国区块链开发大赛成果发布会在苏州隆重召开。 通付盾受邀参与此次盛会, 【基于区块链的“数信云”安全应用与服务平台】获得“江苏省区块链产业发展试点示范项目”荣

    2024年02月16日
    浏览(58)
  • 第十五届全国大学生信息安全竞赛部分WriteUp

    做了10个,都是烂大街的题目,分数很低。CTF榜单186,以为稳进分区赛了。理论题算上变一千五百多名,华东南二百多名,进不去了,WriteUp也不想上传了。 不是密码选手,但密码非预期搞出来几个 签到电台 关注公众号给的提示“弼时安全到达了”,查找这几个字的中文电码

    2024年02月06日
    浏览(60)
  • 第十五届全国大学生信息安全竞赛创新实践能力赛

    ​ 这两个应该是属于非预期,查找文件内容,两个flag都出了: find / |xargs grep -ri flag{ 2/dev/null flag{34f5fdaf-c373-47fd-afab-01ed2914c11a} 解题步骤同上 使用hydra爆破获得root密码toor。 登陆查找(find / |xargs grep -ri flag{ 2/dev/null)获得flag flag{7b352ef0-1bb1-41af-a7d7-b74f62ff23f0} 爆破sha256老脚本套

    2024年02月07日
    浏览(48)
  • 第十五届全国大学生信息安全竞赛知识问答(CISCN)

    一、单项选择题 1、国家秘密的保密期限,除另有规定外,绝密级不超过()年 A、10年 B、50年 C、30年 D、20年 2、安卓逆向中,反编译JAVA通常使用以下哪个软件?( ) A、JPEXS B、dnSpy C、JEB D、IDA 3、我国在信息系统安全保护方面制定的最早一部,也是最基本的一部法规是()

    2024年02月04日
    浏览(59)
  • 2023 年第五届河南省 CCPC 大学生程序设计竞赛

    Problem A. 小水獭游河南 ∣ a ∣ ≤ ∣ Σ ∣ = 26 ,暴力枚举 a 判断 b 是否为是回文串即可,时间复杂度 O ( ∣ Σ ∣ ∣ s ∣ ) 。 |a| ≤ |Σ| = 26,暴力枚举 a 判断 b 是否为是回文串即可,时间复杂度 O(|Σ||s|)。 ∣ a ∣ ≤ ∣Σ∣ = 26 ,暴力枚举 a 判断 b 是否为是回文串即可,时间复

    2024年02月03日
    浏览(89)
  • 2022第十五届全国大学生信息安全竞赛(ciscn)西南赛区部分WP

    EzSignin 访问题目flag是假的,F12源代码,看到base64解码 解码得到flag CODE 访问题目,有个aid.php直接访问不行,使用PHP为协议进行读取,input2需要等于Welcone!,这里要使用data协议编码一下,input3可以随便输入 得到aid.php的代码 很明显的反序列化,直接构造payload: exp: base64解码得

    2024年02月06日
    浏览(54)
  • 2023年第十五届“中国电机工程学会杯”全国大学生电工数学建模竞赛题目 A题:电采暖负荷参与电力系统功率调节的技术经济分析

    建设以新能源为主体的新型电力系统是应对全球气候变化挑战的重要举措。高比例新能源接入导致电力系统调节能力稀缺,亟需开发新的调节资源,如火电深度调峰、建设抽水蓄能电站、配置储能和挖掘负荷中的调节能力等。现代电力负荷中含有较大比重的温控型负荷(如空

    2024年02月06日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包