第十届中国大学生程序设计竞赛 重庆站(CCPC 2024 Chongqing Site)

news/2024/11/30 0:02:37/文章来源:https://www.cnblogs.com/cjjsb/p/18577830

Preface

事实证明比赛前真得训练一下,不然正赛的时候疯狂发病真顶不住

本来想周四晚上 VP 下杭州或者上海,但好像都没上 QOJ,遂找了这赛季的 CCPC 重庆聊以慰藉

本来以为计数场要寄了的,结果最后徐神绝杀 4:59 绝杀 D 之后也是来到 9 题区,感觉也没这么毒瘤


A. 乘积,欧拉函数,求和

很典的一个题,和暑假牛客多校的一个题几乎一样

由于欧拉函数 \(\phi(n)=n\times \prod \frac{p_i-1}{p_i}\),因此一个集合的贡献可以分成两部分,一个是直接乘积起来的部分,一个是后面对每个质因子只求一次贡献的部分

考虑令 \(f(i,mask)\) 表示处理了前 \(i\) 个数,此时出现过的质因数集合的状压值为 \(mask\) 时,前面部分的贡献是多少,转移就是个背包

直接做复杂度肯定不能接受,根据经典套路 \(\sqrt {3000}\) 以内的质数只有 \(16\) 个,因此我们可以只状压较小的质因子

之后将所有数按照最大质因子分组,显然同一组内的贡献可以一起讨论,总复杂度 \(O(n\times 2^{16})\)

#include<cstdio>
#include<iostream>
#include<vector>
#define RI register int
#define CI const int&
using namespace std;
const int N=3005,all=1<<16,mod=998244353;
int n,a[N],vis[N],pri[N],id[N],cnt,f[2][1<<16];
inline void inc(int& x,CI y)
{if ((x+=y)>=mod) x-=mod;
}
inline int quick_pow(int x,int p=mod-2,int mul=1)
{for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
}
struct ifo
{int val,S;inline ifo(CI VAL=0,CI NS=0){val=VAL; S=NS;}
}; vector <ifo> vec[N];
inline void init(CI n)
{for (RI i=2;i<=n;++i){if (!vis[i]) id[i]=cnt,pri[cnt++]=i;for (RI j=0;j<cnt&&i*pri[j]<=n;++j)if (vis[i*pri[j]]=1,i%pri[j]==0) break;}
}
int main()
{init(3000); scanf("%d",&n);for (RI i=1;i<=n;++i){scanf("%d",&a[i]);ifo cur(a[i],0);for (RI j=0;j<16;++j)if (a[i]%pri[j]==0){cur.S|=(1<<j);while (a[i]%pri[j]==0) a[i]/=pri[j];}if (a[i]>1) vec[id[a[i]]].push_back(cur);else vec[0].push_back(cur);}f[0][0]=1;for (auto [val,S]:vec[0]){for (RI mask=0;mask<all;++mask) f[1][mask]=f[0][mask];for (RI mask=0;mask<all;++mask) inc(f[1][mask|S],1LL*f[0][mask]*val%mod);for (RI mask=0;mask<all;++mask) f[0][mask]=f[1][mask];}for (RI mask=0;mask<all;++mask) f[1][mask]=0;for (RI i=16;i<cnt;++i){if (vec[i].empty()) continue;for (auto [val,S]:vec[i]){static int g[2][1<<16];for (RI mask=0;mask<all;++mask) g[0][mask]=f[0][mask],g[1][mask]=f[1][mask];for (RI mask=0;mask<all;++mask){inc(g[1][mask|S],1LL*f[1][mask]*val%mod);inc(g[1][mask|S],1LL*f[0][mask]*(val*(pri[i]-1)/pri[i])%mod);}for (RI mask=0;mask<all;++mask) f[0][mask]=g[0][mask],f[1][mask]=g[1][mask];}for (RI mask=0;mask<all;++mask) inc(f[0][mask],f[1][mask]),f[1][mask]=0;}int ans=0;for (RI mask=0;mask<all;++mask){int cur=f[0][mask];for (RI i=0;i<16;++i)if ((mask>>i)&1) cur=1LL*cur*(pri[i]-1)%mod*quick_pow(pri[i])%mod;inc(ans,cur);}return printf("%d",ans),0;
}

B. osu!mania

签到,注意对浮点数的处理尽可能不要丢精度

#include<cstdio>
#include<iostream>
#include<cmath>
#define int long long
#define RI register int
#define CI const int&
using namespace std;
int t,ppmax,a,b,c,d,e,f;
signed main()
{for (scanf("%lld",&t);t;--t){scanf("%lld%lld%lld%lld%lld%lld%lld",&ppmax,&a,&b,&c,&d,&e,&f);int Acc=round(1.0L*(10000*(300*a+300*b+200*c+100*d+50*e))/(300*(a+b+c+d+e+f)));int A=Acc/100,B=Acc%100; printf("%lld.",A);if (B<10) printf("0%lld%% ",B); else printf("%lld%% ",B);int up=320*a+300*b+200*c+100*d+50*e,dn=320*(a+b+c+d+e+f);// up/dn<=4/5if (5*up<=4*dn) printf("0\n"); else{//up/dn-4/5=(5*up-4*dn)/(5*dn)int pp=round(1.0L*(5*ppmax*(5*up-4*dn))/(5*dn));printf("%lld\n",pp);}}return 0;
}

C. 连方

徐神开场写的,我题目都没看

#include <bits/stdc++.h>void work() {int n; std::cin >> n;std::string a, b; std::cin >> a >> b;std::string full(n, '#'), empty(n, '.'), ans[7];if(a == full && b == full) {std::cout << "Yes\n";for(int i = 0; i < 7; ++i) std::cout << full << char(10);return ;}if(a == empty || b == empty) {std::cout << "Yes\n";if(a == empty) for(int i = 0; i < 7; ++i) std::cout << b << char(10);else           for(int i = 0; i < 7; ++i) std::cout << a << char(10);return ;}if(a == full || b == full) {std::cout << "No\n";return ;}ans[0] = a, ans[6] = b;for(int i = 1; i < 6; ++i) ans[i] = empty;int l, r;for(int i = 0; i < n; ++i) {if(a[i] == '#') ans[1][i] = '.'; else ans[1][i] = '#';if(b[i] == '#') ans[5][i] = '.'; else ans[5][i] = '#';}for(int i = 0; i < n; ++i) {if(ans[1][i] == '#') continue;if(i > 0 && ans[1][i - 1] == '#' || i < n - 1 && ans[1][i + 1] == '#') {ans[2][l = i] = '#';break;}}for(int i = 0; i < n; ++i) {if(ans[5][i] == '#') continue;if(i > 0 && ans[5][i - 1] == '#' || i < n - 1 && ans[5][i + 1] == '#') {ans[4][r = i] = '#';break;}}if(l > r) std::swap(l, r);if(std::abs(l - r) <= 1) ans[3][l] = '#'; else {for(int i = l + 1; i <= r - 1; ++i) ans[3][i] = '#';}std::cout << "Yes\n";for(int i = 0; i < 7; ++i) std::cout << ans[i] << char(10);return ;
}int main() {std::ios::sync_with_stdio(false);int T; std::cin >> T; while(T--) work();return 0;
}

D. 有限小数

徐神和祁神一直在讨论这个题,我当时在想+写 H 就没咋参与

本来一直 WA 最后神秘改了下枚举的上界就过了,十分神奇

#include <bits/stdc++.h>using i128 = __int128_t;
using llsi = long long;constexpr int c2 = 40, c5 = 20;template <typename T>
T myabs(T a) {return a < 0 ? -a : a;
}i128 p2[101] = {1}, p5[101] = {1};
i128 w;i128 exgcd(i128 a, i128 b, i128 &x, i128 &y) {if (0==b) { x = 1; y = 0; return a; }i128 ret = exgcd(b, a % b, y, x);y -= a / b * x;return ret;
}i128 calc(i128 a, i128 b, i128 c) {i128 x0, y0;i128 g = exgcd(a, b, x0, y0);// assert(a * x0 + b * y0 == g);if (c % g != 0) return -1;x0 *= c / g, y0 *= c / g;i128 val = myabs(b / g);x0 = (x0 % val + val) % val;// if (0 == x0) x0 = val;return x0;
}void work() {llsi _a, _b; std::cin >> _a >> _b;i128 a = _a, b = _b;llsi c, d = -1;for(int x = 0; x <= c2; ++x) for(int y = 0; y <= c5; ++y) {if(b * w % (p2[x] * p5[y]) != 0) break;i128 nd = b * w / (p2[x] * p5[y]), nc = calc(- p2[x] * p5[y], b, a * w);if(nc < 0) continue;if(nd > 1'000'000'000) continue;// std::cerr << std::format("x = {}, y = {}, c = {}, d = {}\n", p2[x], p5[y], nc, nd);if(d < 0 || nc < c || nc == c && nd < d) c = nc, d = nd;}std::cout << c << " " << d << std::endl;
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr), std::cout.tie(nullptr);for(int i = 1; i <= std::max(c2, c5); ++i) p2[i] = p2[i - 1] * 2, p5[i] = p5[i - 1] * 5;w = p2[30] * p5[13];// std::cout << i128(w) << char(10);int T; std::cin >> T; while(T--) work();return 0;
}

E. 合成大西瓜

手玩一波会发现答案就是所有度数不为一的点权值的最大值;以及所有度数为一的点权值的次大值;再求一个 \(\max\) 即可

#include<bits/stdc++.h>
using namespace std;const int N = 1e5+5;
int n, m, A[N], deg[N], mx2, mx1, sd1;
signed main() {ios::sync_with_stdio(0); cin.tie(0);cin >> n >> m;for (int i=1; i<=n; ++i) cin >> A[i];for (int i=1; i<=m; ++i) {int x, y; cin >> x >> y;++deg[x], ++deg[y];}if (1==n) {cout << A[1] << '\n';return 0;}mx2 = mx1 = sd1 = -1;for (int i=1; i<=n; ++i) {if (1==deg[i]) {if (A[i]>=mx1) sd1 = mx1, mx1 = A[i];else if (A[i]>sd1) sd1 = A[i];} else {mx2 = max(mx2, A[i]);}}cout << max(mx2, sd1) << '\n';return 0;
}

H. str(list(s))

想清楚了其实很好写,注意到只有 ' 是特殊的,因此我们需要特别记录 的个数

\(f_{i,j}\) 表示 \(s^i\) 下标模 \(p\) 后为 \(j\) 的所有非 ' 字符的贡献;\(g_{i,j}\) 表示 \(s^i\) 下标模 \(p\) 后为 \(j\)' 数量;\(num_{i,j}\) 表示 \(s^i\) 下标模 \(p\) 后为 \(j\) 的所有字符的数量

转移的时候按照题目模拟一下即可,注意特判开头和结尾的变化,复杂度 \(O(|S|+kp)\)

#include<cstdio>
#include<iostream>
#include<cstring>
#define RI register int
#define CI const int&
using namespace std;
const int N=100005,M=3005,mod=1e9+7;
char s[N]; int k,p,f[M][M],g[M][M],num[M][M];
inline void inc(int& x,CI y)
{if ((x+=y)>=mod) x-=mod;
}
int main()
{scanf("%s%d%d",s,&k,&p);int n=strlen(s);for (RI i=0;i<n;++i){++num[0][i%p];if (s[i]=='\'') ++g[0][i%p]; else inc(f[0][i%p],s[i]);}n=(n-1+p)%p;for (RI i=0;i<k;++i){inc(f[i+1][0],(1LL*(num[i][0]-1+mod)%mod*' '%mod+'[')%mod);inc(f[i+1][(5*n+4)%p],(1LL*(num[i][n]-1+mod)%mod*','%mod+']')%mod);for (RI j=0;j<p;++j){inc(f[i+1][(5*j+2)%p],f[i][j]);// inc(f[i+1][(5*j+1)%p],1LL*(num[i][j]-g[i][j]+mod)*'\''%mod);// inc(f[i+1][(5*j+3)%p],1LL*(num[i][j]-g[i][j]+mod)*'\''%mod);inc(g[i+1][(5*j+1)%p],(num[i][j]-g[i][j]+mod)%mod);inc(g[i+1][(5*j+3)%p],(num[i][j]-g[i][j]+mod)%mod);if (j!=0) inc(f[i+1][(5*j+0)%p],1LL*num[i][j]*' '%mod);if (j!=n) inc(f[i+1][(5*j+4)%p],1LL*num[i][j]*','%mod);}for (RI j=0;j<p;++j){inc(g[i+1][(5*j+2)%p],g[i][j]);inc(f[i+1][(5*j+1)%p],1LL*g[i][j]*'"'%mod);inc(f[i+1][(5*j+3)%p],1LL*g[i][j]*'"'%mod);}for (RI j=0;j<p;++j) for (RI k=0;k<5;++k)inc(num[i+1][(5*j+k)%p],num[i][j]);n=(5*n+4)%p;}for (RI i=0;i<p;++i)printf("%d ", int((f[k][i]+1LL*g[k][i]*'\''%mod)%mod));// printf("%c", char((f[k][i]+1LL*g[k][i]*'\''%mod)%mod));return 0;
}

I. 算术

注意到除了 \(1\) 之外的所有卡片一定是直接乘起来最优,现在的问题就是 \(1\) 要怎么使用

一种是拿两个 \(1\) 凑出一个新的 \(2\);另一种是不停地把剩下的 \(1\) 加到做乘法的数中最小的上面

由于 \(a_i\le 100\),我们可以直接枚举新生成了多少个 \(2\),剩下的部分模拟一下找个最优的方案即可

现在的问题是怎么比较两种方案的大小,由于式子是连乘的形式因此直接取对数后相加即可

#include<cstdio>
#include<iostream>
#include<cmath>
#define RI register int
#define CI const int&
using namespace std;
const int N=15,mod=998244353;
int t,a[N],b[N]; long double lg[105];
int main()
{for (RI i=1;i<=100;++i) lg[i]=logl(i);for (scanf("%d",&t);t;--t){for (RI i=1;i<=9;++i) scanf("%d",&a[i]);long double mx=-1; int cs;for (RI i=0;2*i<=a[1];++i){for (RI j=1;j<=9;++j) b[j]=a[j];b[1]-=2*i; b[2]+=i;for (RI j=2;j<9&&b[1];++j){int tmp=min(b[1],b[j]);b[1]-=tmp; b[j]-=tmp; b[j+1]+=tmp;}long double cur=0;if (b[1]>0){if (b[9]==0) cur=0; else{int add=b[1]/b[9],rem=b[1]%b[9];cur+=lg[9+add+1]*rem;cur+=lg[9+add]*(b[9]-rem);}} else{for (RI j=2;j<=9;++j) cur+=lg[j]*b[j];}if (cur>mx) mx=cur,cs=i;}for (RI i=1;i<=9;++i) b[i]=a[i];b[1]-=2*cs; b[2]+=cs;for (RI i=2;i<9&&b[1];++i){int tmp=min(b[1],b[i]);b[1]-=tmp; b[i]-=tmp; b[i+1]+=tmp;}int ans=1;if (b[1]>0){if (b[9]==0) ans=1; else{int add=b[1]/b[9],rem=b[1]%b[9];for (RI i=1;i<=rem;++i) ans=1LL*ans*(9+add+1)%mod;for (RI i=1;i<=b[9]-rem;++i) ans=1LL*ans*(9+add)%mod;}} else{for (RI i=2;i<=9;++i)for (RI j=1;j<=b[i];++j) ans=1LL*ans*i%mod;}printf("%d\n",ans);}return 0;
}

J. 骰子

纯签到,直接 Gauss 一定每个面都能凑到 \(6\) 即可

#include<cstdio>
#include<iostream>
#define RI register int
#define CI const int&
using namespace std;
int n,m;
int main()
{scanf("%d%d",&n,&m);return printf("%d",6*n*m),0;
}

K. 小 C 的神秘图形

看了眼就扔给祁神了,然后被祁神秒了

#include<bits/stdc++.h>
using namespace std;signed main() {ios::sync_with_stdio(0); cin.tie(0);int n; cin >> n;string str1, str2;cin >> str1 >> str2;bool ok=true;for (int i=0; i<n; ++i) {if (str1[i]!='1' && str2[i]!='1') {ok=false; break;}}cout << (ok ? "1\n" : "0\n");return 0;
}

Postscript

这场感觉题太偏向于计数了,导致后期基本没啥事情干,怪不得 downvote 这么多

据说 BIT 也很喜欢出计数,希望昆明能来点适合牢闪的题的说

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubeapps可视化管理Helm Chart包

目录一.基于helm部署kubeapps1.kubeapps介绍2.添加kubeapps的repo3.搜索kubeapps4.下载指定的kubeapps版本5.基于helm部署kubeapps6.访问kubeapps的WebUI二.通过kubeapps部署应用案例1 通过kubeapps查看已经部署的Chart2.通过kubeapps搜索Chart信息 一.基于helm部署kubeapps 1.…

剪映设置封面时候如何防止文字遮挡人物 All In One

剪映设置封面时候如何防止文字遮挡人物 All In One PS 图层叠加 / 前景后景 / 透明度 照片 人物抠图 + 画中画剪映设置封面时候如何防止文字遮挡人物 All In One 原理分析 PS 图层叠加 / 前景后景 / 透明度 照片 人物抠图 + 画中画 solutionsFilmora ???人物抠图 图层叠加 图…

聊一下怎么10分钟速水中危CVE

怎么在10分钟里速水一个中危CVE题目是真的。今天晚上刚接触关于CVE的审计和提交。只能说:牛逼的是真牛逼,水的是真水。 我接下来教你,怎么在10分钟里找到一个CVE的中危漏洞并且提交。然后你就可以去咸鱼接单了,一个一铂快 打开https://code-projects.org/ 随机找一个水项目…

2024-2025-1 20241403 《计算机基础与程序设计》第十周学习总结

学期2024-2025-1 学号20241403 《计算机基础与程序设计》第十周学习总结 作业信息这个作业属于哪个课程 <班级的链接>2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里 <作业要求的链接>2024-2025-1计…

《Django 5 By Example》阅读笔记:p388-p454

《Django 5 By Example》学习第 15 天,p388-p454 总结,总计 66 页。 一、技术总结 1.celery 我觉得书中这种用法太简单了。 2.flower 用于监控 celery。 # 安装 pip install flower # 启动 celery -A myshop flower --basic-auth=root:root # 访问 http://127.0.0.1:555…

java学习11.29

去年22级报销管理系统基本完成,出差报销申请撤销,审批功能基本完成

Kustomize 设计理念与使用说明

Kustomize 设计理念与使用说明 一、设计理念 Kustomize 的设计理念是基于"基础配置 + 补丁"的模式,这里解释一下为什么需要在 base 目录下创建基础配置:基础配置的重要性:base 目录下的配置是所有环境共享的基础配置 包含了服务最基本的定义和配置 确保了不同环境…

【评价指标】ROC曲线与AUC

一、前置知识 ​ 真阳性(TPR):正样本被正确分类个数与所有正样本的总数的比值 \[TPR = \frac{TP}{TP+FN} \]​ 假阳性(FPR):负样本被错误分类个数与所有负样本的总数的比值 \[FPR=\frac{FN}{FN+TN} \]​ 其中,TP表示正确分类的正样本,TN表示正确分类的负样本,FN表示错误分…

overleaf中使用中文

用的是这个博客里面的方法三,很方便。 https://blog.csdn.net/m0_52037292/article/details/109768317\usepackage{CJKutf8} \usepackage{CJKutf8}\begin{document}\begin{CJK*}{UTF8}{gbsn} 数学、中英文皆可以混排。You can intersperse math, Chinese and English (Latin …

20222409 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1 本周学习内容 本周学习了信息收集与渗透测试相关技术,主要包括Metasploit、nmap和Nessus的使用。Metasploit是渗透测试框架,能提供多种攻击模块,如远程代码执行、提权和后渗透功能(如键盘记录、文件操作等),可用于模拟攻击和漏洞利用; nmap被用于扫描目标…

gin, gorm快速入门

Gin Gin入门 gin的学习要点如何定义路由:包括参数路由、通配符路由 如何处理输入输出 如何使用middleware解决AOP问题在 Gin 里面,用 Engine 来监听一个端口,是一个逻辑上的服务器。 一个 Go 进程可以创建多个 Engine。 hello, world 使用步骤:在应用中引入 Gin 依赖:go g…

20222424 2021-2022-2 《网络与系统攻防技术》实验七实验报告

20222424 2021-2022-2 《网络与系统攻防技术》实验七实验报告 1.实验内容 1.1本周学习内容Web安全基础/前后端 SQL注入原理 XSS脚本攻击 CSRF漏洞1.2实验内容及要求 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法。具体实践有 (1)简单应用SET…