栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

XTU 1377 Factorization

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

XTU 1377 Factorization

Factorization 题目描述

根据质因子唯一分解定理可知n=pk11pk22…pkmm,其中pi都是质数。我们定义f(n)=m, 求g(a,b)=∑bi=af(n)。

输入

第一行是一个整数T(1≤T≤1000),表示样例的个数。

以后每个样例占一行,为两个整数 a(2≤a≤b≤106)。

输出

依次每行输出一个样例的结果,为一个整数。

样例输入
2
2 2
2 10
样例输出
1
11
Sample Input
 
Sample Output
 

 

原代码如下:

#include
int Prime[1000001] = { 0 };//下标为素数
int prime[1000001] = { 0 };//放素数
int primenum[1000001] = { 0 };//存放下标对应的m
void IN();//初始化素数
void save();
int search(int num);
void Save();
int main()
{
    int T;
    IN();
    save();
    Save();
    scanf_s("%d", &T);
    while (T--) {
        int a, b;
        scanf_s("%d %d", &a, &b);
        printf("%dn", primenum[b] - primenum[a - 1]);
    }
    return 0;
}
int search(int num) {
    int m = 0, i = 0;
    while (num != 1) {
        int flag = 0;
        while (num % prime[i] == 0) {
            num /= prime[i];
            if (flag == 0)flag = 1;
        }
        if (flag)m++;
        i++;
    }
    return m;
}
void save() {
    for (int i = 2; i <= 1000000; i++)
        primenum[i] = search(i);
}
void Save() {
    for (int i = 3; i <= 1000000; i++)primenum[i] += primenum[i - 1];
}
void IN() {
    int i, j, n = 0;
    for (i = 2; i <= 1000000; i++)Prime[i] = 1;
    for (i = 2; i <= 1000000; i++)
        if (Prime[i])
            for (j = 2; i * j <= 1000000; j++) Prime[i * j] = 0;
    for (i = 2; i <= 1000000; i++)
        if (Prime[i])prime[n++] = i;
}

遇到问题:

1、超时

修改后代码如下:

#include
int Prime[1000001] = { 0 };//下标为素数
int prime[1000001] = { 0 };//放素数
int primenum[1000001] = { 0 };
int n = 0;
void IN();//初始化素数
void save();
int search(int num);
void Save();
int main()
{
    int T;
    IN();
    save();
    Save();
    scanf_s("%d", &T);
    while (T--) {
        int a, b;
        scanf_s("%d %d", &a, &b);
        printf("%dn", primenum[b] - primenum[a - 1]);
    }
    return 0;
}
int search(int num) {
    int m = 0, i;
    for (i = 0; i < n && prime[i] * prime[i] <= num; i++) {
        if (num % prime[i] == 0) {
            m++;
            while (num % prime[i] == 0)num /= prime[i];
        }
    }
    if (num != 1)m++;
    return m;
}
void save() {
    for (int i = 2; i <= 1000000; i++)
        primenum[i] = search(i);
}
void Save() {
    for (int i = 3; i <= 1000000; i++)primenum[i] += primenum[i - 1];
}
void IN() {
    int i, j;
    for (i = 2; i <= 1000000; i++)Prime[i] = 1;
    for (i = 2; i <= 1000000; i++)
        if (Prime[i])
            for (j = 2; i * j <= 1000000; j++) Prime[i * j] = 0;
    for (i = 2; i <= 1000000; i++)
        if (Prime[i])prime[n++] = i;
}

开始的时候不断超时,没想到存了数据后search函数太慢的,导致还是超时。

最后还是有劳一位大佬相助得以解决

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/330471.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号