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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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


洛谷 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[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值