洛谷【X ROUND 2】模拟赛心得&未完的解题报告

博主分享了参加洛谷X ROUND 2模拟赛的心得,详细分析了解题过程,涉及题目包括洛谷5436 T1缘分、5440 T2奇迹、5437 T3约定和5438 T4记忆。文章涵盖了问题的解题思路、代码实现和一些关键点,如质数判断、完全平方数的处理等。

前言

其实突然发现不应该在期末考试前两天比赛的,但是,唉


洛谷 5436 T1缘分

题目

找出不超过 n n n的正整数 a , b a,b a,b,使 l c m ( a , b ) lcm(a,b) lcm(a,b)最大


分析

8min: l c m ( a , b ) = a b g c d ( a , b ) lcm(a,b)=\frac{ab}{gcd(a,b)} lcm(a,b)=gcd(a,b)ab,就是让 g c d ( a , b ) gcd(a,b) gcd(a,b)尽量小,并让 a b ab ab尽量大,那就是两个互质的数使它乘积变大,那不就是 n ( n − 1 ) n(n-1) n(n1)吗,交上去WA

16min:莫非多组数据每组都卡掉了,嗯嗯嗯嗯, n = 1 n=1 n=1时要特判答案为1,AC


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
inline signed iut(){
   
   
    rr int ans=0; rr char c=getchar();
    while (!isdigit(c)) c=getchar();
    while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    return ans;
}
inline void print(long long ans){
   
   if (ans>9) print(ans/10); putchar(ans%10+48);}
signed main(){
   
   
    for (rr int t=iut(),n;t;--t){
   
   
        n=iut();
        if (n==1) putchar(49);
            else print(1ll*n*(n-1));
        putchar(10);
    }
    return 0;
}

洛谷 5440 T2奇迹

题目

有一个可能残缺的八位日历,问有多少种真实存在的日历满足“年+月+日”、“月+日”、“日”都是质数


分析

能改很久的深搜题,几个坑点

  1. 要判断平年闰年以及2月的天数
  2. 判断质数的条件
  3. 其实也没什么,根据格里历,1582年10月5日到1582年10月14日被删除了,然而并没有什么用,因为即使真实存在也不合法

时间复杂度 O ( 能 过 ) O(能过) O()


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#define rr register
using namespace std;
const int d[13]={
   
   0,31,29,31,30,31,30,31,31,30,31,30,31};
bool v[10001]; int prime[1231],cnt,a[11],ans; char s[11];
inline void dfs(int dep,int now){
   
   
    if (dep>7){
   
   
        rr int now1=now/10000,now2=now%10000,now3=now%100; now2=now2/100;
        if (!(now1%400==0||(now1%100&&now1%4==0))&&now2==2&&now3==29) return;//平年出现29天?
        if (d[now2]<now3||v[now2*100+now3]||v[now3]) return;//不存在这种月份或者月+日或日不是质数
        rr int t=sqrt(now);
        for (rr int i=2;i<=cnt&&prime[i]<=t;++i)
            if (now%prime[i]==0) return;
        ++ans;
        return;
    }
    switch (dep){
   
   
        case 0:case 1:case 2:case 3:{
   
   
            now=(now<<3)+(now<<1)+a[dep];
            if (dep==3&&!a[dep]&&!now) return;//0000不可以
            now+=dep==3&&now==-1;
            if (~a[dep]) dfs(dep+1,now);
            else for (rr int i=dep==3&&!now;i<10;++i)
                dfs(dep+1,++now);
        }break;
        case 4:{
   
   
            if (~a[dep]) dfs(dep+1,(now<<3)+(now<<1)+a[dep]);
            else dfs(dep+1,(now<<3)+(now<<1)),dfs(dep+1,(now<<3)+(now<<1)+1);
        }break;
        case 5:{
   
   
            if (~a[dep
&lt;think&gt;好的,我现在要解决用户关于洛谷MXOI Round 1方格问题的疑问。用户想要了解题目描述或解法。首先,我需要回忆一下相关的竞赛题目,尤其是MXOI Round 1中的方格题。根据用户提供的引用[2],题目编号是P9582,所以可能需要先确认这个题目的具体内容。 根据引用[2]中的信息,题目涉及一个二维数组表示的方格图,每个格子的值在1到9之间。解题思路是使用桶(数组)统计每个数字出现的次数,记为c_x,即x出现的次数。这可能涉及到统计每个数字的出现次数,并根据这些次数进行某种计算,比如找出最多的次数或者进行组合计算。 接下来,我需要考虑用户可能需要的问题描述和题解步骤。首先,问题描述可能类似于给定一个n&times;m的方格,每个格子有一个数字a_i,j(1&le;a_i,j&le;9),然后需要成某个任务,比如统计每个数字出现的次数,并基于这些数据计算结果。可能的题目要求是计算所有数字的出现次数,然后根据这些次数进行某种操作,例如求最大值、构造某种条件或者进行数学运算。 在解法方面,引用[2]提到用桶来统计次数,这通常是指使用一个长度为10的数组(索引0-9,但实际使用1-9),遍历每个格子,对应数字的位置加一。统计成后,可能需要进一步处理这些次数,比如计算出现次数最多的数字,或者进行某种组合数学的计算。 可能的解题步骤包括: 1. 读取输入,包括n和m的值,然后是n行每行m个数字。 2. 初始化一个大小为10的数组c,初始值全为0。 3. 遍历每个格子,将对应的c[a_i,j]加一。 4. 根据题目具体要求处理c数组,比如计算最大值、总和或其他条件。 例如,假设题目要求找出出现次数最多的数字,如果有多个则输出最大的那个。此时,在统计c数组后,遍历c数组找到最大值和对应的数字。或者题目可能要求计算满足某种条件的数字组合,比如两个数字的出现次数之和最大等。 需要注意的是,题目可能有不同的变体,比如不同的约束条件或不同的输出要求,所以需要根据具体的题目描述来确定。但根据引用[2]的信息,至少需要用到桶统计的方法。 另外,用户可能还想知道类似的问题,或者如何优化这样的解法。例如,当方格非常大时,是否有更高效的方法,但考虑到每个数字范围固定为1-9,桶统计的时间复杂度已经是O(nm),应该足够高效,不会有性能问题。因此,解法本身已经是最优的。 最后,用户可能需要相关的题目推荐,例如其他使用桶统计或类似技巧的题目,或者涉及二维数组处理的题目。例如,统计字符出现次数的问题,或者在网格中寻找特定模式的问题。 总结,我需要给出题目的大致描述,详细的解法步骤,以及可能的扩展问题或相关题目推荐。&lt;/think&gt;### 洛谷 MXOI Round 1 方格题(P9582)解法 #### 题目描述(根据引用[2]推测) 给定一个 $n \times m$ 的方格图,每个格子中的数字 $a_{i,j}$ 满足 $1 \le a_{i,j} \le 9$。要求统计每个数字 $1$ 至 $9$ 在方格中的出现次数,并根据这些次数成特定计算(例如求最大值、总和或其他组合结果)[^2]。 --- #### 解法步骤 1. **输入处理** 读取 $n$ 和 $m$,然后读取 $n$ 行,每行 $m$ 个整数,存入二维数组。 2. **桶统计** 初始化一个长度为 $10$ 的数组 `cnt`(索引 $0$ 使用),遍历每个格子,对每个数字 $a_{i,j}$ 执行 `cnt[a_{i,j}]++`。 3. **计算结果** 根据题目具体要求处理统计结果。例如: - **最大值**:遍历 `cnt[1]` 到 `cnt[9]` 找最大出现次数。 - **总和**:若要求所有数字出现次数的加权和,可计算 $\sum_{x=1}^9 x \cdot \text{cnt}[x]$。 - **组合条件**:如比较两个数字的出现次数关系。 --- #### 代码实现 ```python n, m = map(int, input().split()) cnt = [0] * 10 # 索引0~9,实际使用1~9 for _ in range(n): row = list(map(int, input().split())) for num in row: cnt[num] += 1 # 示例:输出每个数字的出现次数 for x in range(1, 10): print(f&quot;数字{x}出现了{cnt[x]}次&quot;) ``` --- #### 相关题目推荐 1. **统计类题目** - **P2550 [AHOI2001] 彩票摇奖**:统计中奖号码的出现次数。 - **P1567 统计天数**:统计连续递增区间的长度。 2. **二维数组处理** - **P2615 幻方**:按规则生成二维数组。 - **P1789 插火把**:模拟光照覆盖的网格问题。 3. **桶排序/计数应用** - **P1271 选举学生会**:利用计数排序快速统计票数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值