2021第7届中国大学生程序设计竞赛CCPC广州站, 签到题4题

news2025/1/9 16:24:07

文章目录

      • I.Pudding Store
      • H.Three Integers
      • C.Necklace
      • F.Cactus

补题链接:https://codeforces.com/gym/103415

I.Pudding Store

I. Pudding Store
time limit per test2.0 s
memory limit per test512 megabytes
inputstandard input
outputstandard output
159 is a boy. He has a pudding store.

There are n different puddings numbered from 1 to n lined up in a row in the pudding store. (Note that the i-th pudding in the row may not be the pudding with the number i.) Now, n students numbered from 1 to n are coming to sample these puddings in a specific way. That is, for the i-th student, he will sample each one of the first i puddings in the row. Sampling the pudding numbered i gives the sampler a satisfaction value of 2×i. And if the sum of all satisfaction values that the i-th student gets is divisible by i, we would say that the i-th student is satisfied.

Now, 159 wants to know, how many different arrangements of the puddings in a row that every student will be satisfied after sampling. Two arrangements are different, if there exists a pudding that its position is different. Note that the number of arrangements may be very large so he just needs the remainder after division by 998244353 of the result.

Input
Each test contains multiple test cases. The first line contains the number of test cases t (1≤t≤10). Description of the test cases follows.

The first and only line of each test case contains one integer n (1≤n≤109) — the number of the puddings and the students.

Output
For each test case, print a single line that contains one integer — the number of satisfying arrangements modulo 998244353.

Example
inputCopy
3
1
2
3
outputCopy
1
2
6

题意:

  • 构造一个1-n的排列,需要满足前i项的和是2i的倍数,求能构造的这样的排列的方案数。
  • T组数据,每次给出一个n,求方案数%998244353。

思路:

  • 因为感觉条件比较苛刻,所以找一下规律,不难发现n>3时最后一项只能取1或n。
    对<=3的分类讨论,所以答案为 6 ∗ 2 n − 3 6*2^{n-3} 62n3, 快速幂即可。
  • 官方证明推导过程:
    在这里插入图片描述
    在这里插入图片描述
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = 998244353;
LL pows(LL a, LL x, LL p) { if(x==0)return 1; LL t = pows(a, x>>1, p); if(x%2==0)return t*t%p; return t*t%p*a%p; }

int main(){
    int T;  cin>>T;
    while(T--){
        LL n;  cin>>n;
        if(n==1 || n==2)cout<<n<<"\n";
        else if(n==3)cout<<6<<"\n";
        else cout<<6ll*pows(2,n-3,mod)%mod<<"\n";
    }
    return 0;
}

H.Three Integers

H. Three Integers
time limit per test1 second
memory limit per test512 megabytes
inputstandard input
outputstandard output
You are given three non-negative integers a, b, and c. Find three positive integers x, y, and z that satisfy xmody=a, ymodz=b, and zmodx=c.

Input
The first line contains an integer t (1≤t≤105) — the number of test cases.

Each test case contains 3 integers a, b, c (0≤a,b,c≤109) on a single line.

Output
For each test case, if there are such three integers satisfying the condition, output “YES”, then output the three integers x, y, z (1≤x,y,z≤1018) on the following line, or “NO” otherwise.

Example
inputCopy
4
0 0 0
1 2 3
6 6 6
11 3 3
outputCopy
YES
1 1 1
YES
5 2 8
NO
YES
11 45 14

题意:

  • 给定三个非负整数 a、b 和 c, 求三个正整数 x、y 和 z。
    满足x mod y = a,y mod z = b 且 z mod x = c。
  • 0 ≤ a, b, c ≤ 1000,000,000, 输出满足 1 ≤ x, y, z ≤ 10^18。

思路:

  • 先找特殊的,当三个值相等时,当且仅当a=b=c=0时有解,否则无解。
  • 然后列一下通式,x = k1y+a, y = k2z+b, z = k3x+c。
    套到一起可以发现 x = k1k2k3x + k1k2c + k1b + a,y=k2k3x+k2c+b,因为k1,k2,k3>0。
    所以可以得到k1, k2, k3中至少有一个为0, 即有一个值和输入的值相等
  • 不妨设x=a,然后只需要适当构造,取适当的 u,v 使得 z = ua+c > b 且 y = vz+b > a成立即可(构造方案不唯一)。
  • vp时是队友写的,构造方案大致是相邻两个数作差再特判一下。补题时发现网上有大佬分类讨论推出了全部的公式,直接套公式就能过,借鉴了一下。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
    int T;  cin>>T;
    while(T--){
        int a, b, c;  cin>>a>>b>>c;
        if(a==b && b==c){
            if(a!=0)cout<<"NO\n";
            else cout<<"YES\n1 1 1\n";
            continue;
        }
        LL x, y, z, k;  
        if(b > a){
            k = max(0, (c - a) / b) + 1;
            x = k * b + a;
            y = b;
            z = (k * b + a) * 2 + c;
        }else if(a > c){
            k = max(0, (b - c) / a) + 1;
            x = a;
            y = (k * a + c) * 2 + b;
            z = k * a + c;
        }else if(c > b){
            k = max(0, (a - b) / c) + 1;
            x = (k * c + b) * 2 + a;
            y = k * c + b;
            z = c;
        }
        cout<<"YES\n";
        cout<<x<<" "<<y<<" "<<z<<"\n";
    }
    return 0;
}

C.Necklace

C. Necklace
time limit per test1.0 s
memory limit per test512 megabytes
inputstandard input
outputstandard output
Bob has given Alice a necklace as her birthday gift. That necklace has N crystals, M of which catches her fancy. Formally, crystals with labels of 1…N are strung sequentially in a circle. And those catching her fancy are labelled n1,n2,…,nM.

Alice would like the necklace to be divided into M pieces. She asked Bob to sever the necklace into M pieces. Each piece should consist of a sequence of crystals as in the original necklace (i.e., the crystal labels are contiguous, except that 1 following N is accepted) and should include one crystal catching Alice’s fancy. Obviously, each crystal must belong to exactly one piece.

However, an excessively long piece of severed necklaces could not fit Alice’s slim neck. So she wants to know, among all possible severings as requested, what the minimum length of the longest piece from a severed necklace is. She wants you to answer this question.

Input
The first line of the input data contains 2 integers N and M (1≤M≤N<1018 and M≤106).

The second line contains M integers, the i-th of which represents ni. The ni’s are given in ascending order.

Output
You need to output your answer in one line.

Example
inputCopy
10 4
2 5 6 8
outputCopy
3
Note
As for the example: You can sever the necklace into [1,3],[4,5],[6,7],[8,10].

Considering huge scale of data, here is a way provided to help input faster:

#define gc()(is==it?it=(is=in)+fread(in,1,Q,stdin),(is==it?EOF:*is++):*is++)
const int Q=(1«24)+1;
char in[Q],*is=in,*it=in,c;
void read(long long &n){
  for(n=0;(c=gc())<'0'||c>'9';);
  for(;c<='9'&&c>='0';c=gc())n=n*10+c-48;
}

题意:

  • 长度为 n 的项链(是个环!)上有 m 个宝石,每个宝石要放在同一段里,求最长段长度的最小值。

思路:

  • 开始没看到是环,一眼二分答案想硬A上去,WA了两发才发现还有环这个操作。不过肯定还是二分答案+贪心的,就是贪心判断的方法需要改一下。

  • 每次check的时候从第一个位置开始贪心,一开始最大偏移量n-a[m]+a[1]-1,开个变量表示当前起始位置最大的偏移量,每跑一段区间都取个min,然后记录一下最开始的起始位置一共最大往前的偏移量即可。

  • 官方讲解:
    在这里插入图片描述
    在这里插入图片描述

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    #define gc()(is==it?it=(is=in)+fread(in,1,Q,stdin),(is==it?EOF:*is++):*is++)
    const int Q=(1<<24)+1;
    char in[Q],*is=in,*it=in,c;
    void read(long long &n){
      for(n=0;(c=gc())<'0'||c>'9';);
      for(;c<='9'&&c>='0';c=gc())n=n*10+c-48;
    }
    
    const int maxn = 1e6+10;
    LL n, m, a[maxn];
    int check(LL x){
        LL mx = n-(a[m]-a[1]+1), mm = 0;   //最大能往左边移的量, 当前左移的量
        LL lst = 0, mx0 = mx;              //后一段要给前一段的大小
        for(int i = 1; i < m; i++){
            LL now = x-lst;           //当前能分的=x-给了上一段的
            if(now<=0)return 0;       //当前能分的是负数或0了,寄
            LL cc = a[i+1]-a[i];      //当前需要分的
            if(cc>now){               //足够分
                lst = cc-now;         //分一下
                mx = min(mx, now-1);  //更新最大偏移
            }else{
                lst = 0;                 //不够分
                LL m3 = min(mx, now-cc); //往左边移
                mm += m3;                //累加左移的量
                mx = min(mx-m3, cc-1);   //更新最大偏移
            }
        }
        LL ed = lst+mx0+1-x;
        if(x-lst>=mx0+1 || mm>=ed)return 1;
        return 0;
    }
    
    int main(){
        read(n);  read(m);
        for(int i = 1; i <= m; i++)read(a[i]);
        LL l = 1, r = n; 
        while(l < r){
            LL mid = (l+r)>>1;
            if(check(mid))r = mid;
            else l = mid+1;
        }
        cout<<l<<"\n";
        return 0;
    }
    

F.Cactus

F. Cactus
time limit per test1 second
memory limit per test512 megabytes
inputstandard input
outputstandard output
An undirected connected graph is called a cactus, if and only if each edge of it belongs to at most one simple cycle. A simple cycle is a cycle that has no repeated vertices.

Now suppose there are fn cactuses of n distinct vertices, and the cactuses may have parallel edges and must not have self-loops, you need to calculate ∑ni=1∏j≠i1+fi−fifjfi−fj.

The sum of a zero-length sequence is 0, and the product of a zero-length sequence is 1.

Input
A single line contains an integer n (1≤n≤3×105).

Output
Suppose the reduced form of the answer is xy, and you only need to output the value of x×y998244351mod998244353.

Example
inputCopy
2
outputCopy
1
Note
In the first example, f1=1,f2=2, and the answer is 1.

题意:

  • 官方
    在这里插入图片描述

思路:

  • 一开始是没看懂f表示的意思(没想到仙人掌),就代了一下各种值,结果发现n=2和n=3的时候不管带进去什么值,式子算出来的结果都是一样的
  • 然后开始打表,验证了一下真的是代什么都一样,把n=1~20的结果都跑出来,很明显是个斐波那契数列,所以就直接O(n)扫一遍就好啦。
  • 官方证明:
    在这里插入图片描述
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 3e5+10;
const LL mod = 998244353;
LL f[maxn];
int main(){
    LL n;  cin>>n;
    f[1] = f[2] = 1;
    for(int i = 3; i <= n; i++){
        f[i] = (f[i-1]+f[i-2])%mod;
    }
    cout<<f[n]<<"\n";
    return 0;
}

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

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

相关文章

快速排序图解(两种思想)

七大排序之快速排序 文章目录七大排序之快速排序前言一、《算法导论》中的分区思想1.1 算法思想1.2 代码实现二、Hoare挖坑法2.1 算法思想2.2 代码实现三、算法分析四、注意事项总结前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博…

【每天学习一点新知识】网络安全--截获攻击

截获攻击原理和后果 原理 若正常传输路径为终端A到终端B&#xff0c;黑客首先改变传输路径为终端A—黑客终端—终端B&#xff0c;使得传输信息必须经过黑客终端&#xff0c;黑客终端就可以截获终端A传输给终端B的消息。 后果 目前很多访问过程采用明码方式传输登录的用户名和密…

C++入门基础(下)

目录 引用 引用概念 引用特性 1.引用在定义时必须初始化 2.一个变量可以有多个引用 3.引用一旦引用一个实体&#xff0c;再不能引用其他实体. 常引用 使用场景 1.作为参数使用 2.作为返回值使用 引用和指针的区别 内联函数 内联函数的概念 内联函数特性 宏的优缺点 auto关键字 …

scala spark dataframe 时间加减

参考Adding 12 hours to datetime column in Spark 只针对标准化时间戳 yyyy-MM-dd HH:mm:ss 如果是 yyyy-MM-dd HH:mm 转换后会自动补到 HH:mm:ss ss位补0 时间英文简写查询 HOUR 代表小时 MINUTE 代表分钟 SECOND 代表秒 DAY MONTH YEAR 正数代表向后 负数代表向前 …

AI绘画突然爆火?快速体验二次元画师NovelAI(diffusion)

目录0 写在前面1 diffusion vs GAN2 NovelAI3 AI绘画环境搭建4 体验AI创作0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器学习模型&#xff1a;决策树、支持…

到了30岁,我才有了深刻的感悟:千万不要一辈子靠技术生存

千万不要一辈子靠技术生存&#xff0c;这句话&#xff0c;我也是到了快30岁才有了深刻认知。 当我20多岁&#xff0c;年收入2-3W的时候&#xff0c;我会认为说这话的人都是自身技术不咋地&#xff0c;想靠技术吃饭吃不了。 然而&#xff0c;快30岁了&#xff0c;虽然技术小有…

【Java】之IO流

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 特别标注&#xff1a;仅为自己的学习记录笔记&#xff0c;方便复习和加深记忆&#xff0c;仅供借鉴参考&#xff01; 目录 IO流概述 IO流分类 按数据的流向 按数据类型 字符流 字节流 字节流写数…

【Linux】虚拟机安装Ubuntu后的一些通用设置

文章目录前言一、虚拟机缩放设置二、实现本机和虚拟机之间复制粘贴共享三、ubuntu中vi文件时方向键等问题四、虚拟机扩容五、时区和时间格式设置六、防火墙相关七、中文输入法问题八、虚拟机和主机之间的互通前言 主要是记录虚拟机中安装ubuntu后一些常规设置操作。 一、虚拟…

当你使用MPLS时,不要忘记还有SD-WAN!

企业网络管理人员和IT部门主管在考虑其WAN架构时最常见的问题就是&#xff1a;“为什么我要选择SD-WAN而不是MPLS&#xff1f;”确实&#xff0c;选择新技术时通常会带来“不确定性”。 与MPLS相比&#xff0c;SD-WAN更便宜&#xff0c;性能更强&#xff0c;也带来了更低成本的…

IDEA安装及Clone代码

IDEA安装及Clone代码 文章目录1.IDEA下载2.IDEA安装3 IDEA clone(克隆) 代码1.IDEA下载 官网下载地址&#xff1a; DEA 分为两个版本&#xff1a; 旗舰版(Ultimate)和社区版(Community)。 旗舰版&#xff1a;收费(限 30 天免费试用)&#xff0c;功能全面&#xff0c;插件丰富…

公众号查题系统搭建

公众号查题系统搭建 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…

刚来的00后真的卷,听说工作还没两年,跳到我们公司直接起薪20k...

前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条件不太好&#xff0c;一大家子…

c++内存管理:

目录 new和delete 使用方法&#xff1a; 注意事项&#xff1a; new申请不需要检查返回值 operator new和operator delete函数的讲解 c语言申请内存有哪些方法&#xff1a; 答&#xff1a;malloc calloc realloc三种 #include<stdlib.h> void test() {int*p1 (in…

Day11-尚品汇-退出登录

1.在Header组件里面&#xff1a; 1》绑定一个click事件 2》写其触发的方法 2.发请求通知服务器 1》先观察文档 2》.在api里面写代码&#xff1a; 3》在store仓库user.js里面也要写代码&#xff1a; 1&#xff09; 不单单向服务器发请求清除token&#xff0c;而且需要清除use…

【MLOPs】Docker

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Python基础加强学习

一、python概述 1. python的应用领域 web开发大数据处理人工智能自动化运维开发云计算爬虫游戏开发 2. 安装python 要进行python开发&#xff0c;首先要安装python解释器&#xff0c;这里说的安装python说的就是安装python的解释器。 测试python是否安装成功&#xff0c;在…

基于springboot的校园二手网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

过滤器和拦截器的区别

目录 1 前言 2 区别 2.1 实现原理不同 2.2 使用范围不同 2.3 执行顺序不同 4 注入Bean的情况不同 1 前言 可能有些小伙伴们在接手公司的项目时&#xff0c;经常看到公司的项目中既有过滤器又有拦截器&#xff0c;那么它们既然都拦截的作用&#xff0c;那么各自扮演着什么…

pyinstaller打包出错记录

稍微记录一下最近在liunx上pyinstaller打包出错 目录稍微记录一下最近在liunx上pyinstaller打包出错1 号坑 Python3.7.0安装2号坑 成功打包但是执行失败小结后面代码的环境是在Windows子系统下的Ubuntu 20.04下进行的。vscode可以通过&#xff0c;配置WSL来进入环境&#xff08…

Pytorch+Python实现人体关键点检测

用PythonPytorch工程代码对人体进行关键点检测和骨架提取&#xff0c;并实现可视化。 使用背景&#xff1a; 物体检测为许多视觉任务提供动力&#xff0c;如实例分割、姿态估计、跟踪和动作识别。它在监控、自动驾驶和视觉答疑中有下游应用。当前的对象检测器通过紧密包围对象…