湘大oj-数码积性练习笔记

一.题目描述

二.初始代码

问题:时间超限

cs 复制代码
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
int s(int n)//数码和
{
   
    int num = 0;
    while (n)
    {
        num += n % 10;
        n /= 10;
    }
    return num;
}
bool check(int n)
{
    for (int i = 2;i * i <= n;i++)
    {
        if (n % i != 0)
            continue;
        int x = i, y = n / i;
        if (s(n) == s(x) * s(y))
            return true;
    }
    return false;
}
bool N[10000010] = { false };
void Sum()
{
    for (int i = 1;i <= 10000000;i++)
    {
        if (check(i))
            N[i] = true;
    }
    return;
}
int main()
{
    int t;scanf("%d", &t);
    Sum();
    while (t--)
    {
        int L, R;
        scanf("%d %d", &L, &R);
        int cnt = 0;
        for (int i = L;i <= R;i++)
        {
            if (N[i])
                cnt++;
        }
        printf("%d\n", cnt);
    }
    return 0;
}

三.反思问题

考虑到可以在遍历样例前将所有可能的n记录下来,但忽略了每个数值都遍历寻找因数的代价过大(因子问题可以考虑用埃式筛法解决),没有考虑到可以运用前缀和的方法存储个数提高效率,也没有考虑到可以提前用数组存储各数值数码和提高效率.......

关键优化点总结

  1. 避免对每个数单独分解因子,而是通过双重循环生成所有可能的乘积

  2. 提前计算数码和,避免重复计算

  3. 使用前缀和快速回答区间查询

  4. 利用乘积对称性减少循环次数

最终AC代码

cs 复制代码
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
//全局变量,分配在数据段,不会溢出
int s[10000010] = { 0 };
bool N[10000010] = { false };
int pre[10000010] = { 0 };
int main()
{
    int t;scanf("%d", &t);
    //数码和可以预处理,用数组存储提高效率
    for (int i = 1;i <= 1e7;i++)
    {
        s[i] = s[i / 10] + (i % 10);
    }
    
    //结合埃式筛选法遍历找出满足"数码积性"的n(素数,合数问题)
    for (int i = 2;i <= 1e7;i++)
    {
        if (!N[i])
        {
            for (int j = i;(long long)j * i <= 1e7;j++)
            {
                int n = j * i;
                if (s[n] == s[j] * s[i])
                    N[n] = true;
            }
        }
    }

    //区间个数运用前缀和
    for (int i = 4;i <= 1e7;i++)
    {
        pre[i] = pre[i - 1] +( N[i] ? 1 : 0);
    }
    while (t--)
    {
        int L, R;
        scanf("%d %d", &L, &R);
        printf("%d\n", pre[R] - pre[L - 1]);
    }
    return 0;
}
相关推荐
AI科技星6 分钟前
时空的固有脉动:波动方程 ∇²L = (1/c²) ∂²L/∂t² 的第一性原理推导、诠释与验证
数据结构·人工智能·算法·机器学习·重构
阿豪只会阿巴13 分钟前
【多喝热水系列】从零开始的ROS2之旅——Day4
c++·笔记·python·ros2
charlie11451419126 分钟前
FreeRTOS:软件定时器(Software Timers)与时间管理
开发语言·笔记·学习·freertos·实时操作系统·工程
2401_8414956428 分钟前
【LeetCode刷题】寻找重复数
数据结构·python·算法·leetcode·链表·数组·重复数
laplace012333 分钟前
LangChain 1.0 入门实战(Part 1)详细笔记
笔记·python·langchain·numpy·pandas
罗技12344 分钟前
Easysearch 集群监控实战(下):线程池、索引、查询、段合并性能指标详解
前端·javascript·算法
一路往蓝-Anbo1 小时前
C语言从句柄到对象 (七) —— 给对象加把锁:RTOS 环境下的并发安全
java·c语言·开发语言·stm32·单片机·嵌入式硬件·算法
中國龍在廣州1 小时前
谈谈2025年人工智能现状及发展趋势分析
人工智能·深度学习·算法·自然语言处理·chatgpt·机器人·机器人学习
jdlxx_dongfangxing1 小时前
每日课堂笔记(2026年1月1日)
笔记
北岛寒沫1 小时前
北京大学国家发展研究院 经济学辅修 经济学原理课程笔记(第十四课 寡头)
经验分享·笔记·学习