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

XTU 1377 Factorization

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

XTU 1377 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

思路:打表

清晰的AC代码如下:

#include 
#define N 1000010
using namespace std;
int ch[N+10],a[N+10],sum[N+10];//素数打表,质因子打表,求和打表
int main()
{
    ch[1]=1;
    ch[2]=0;
    int i,j;
    for(i=2;i*i<=N;i++){//素数打表,0是素数
        if(!ch[i]){
            for(j=i*i;j<=N;j+=i){
                ch[j]=1;
            }
        }
    }
    for(i=2;i<=N;i++){//如果是质数那么p只有1个
        if(ch[i]==0){
            a[i]=1;
        }
    }
    for(i=2;i<=N;i++){
        for(j=2;j*i<=N;j++){
            if(!ch[i]){//定i为质因子,j你别管就单单当做一个乘数来看待,我们主要以i为质因子
                a[i*j]++;
            }
        }
    }
    for(i=2;i<=N;i++){
        sum[i]=sum[i-1]+a[i];//求和
    }
    int t;
    cin>>t;
    while(t--){
        int a,b;
        cin>>a>>b;
        cout< 

优化:

去掉了求和打表,直接在质因子数组里求和。

#include 
#include 
#define N 1000010
using namespace std;
int ch[N+10],a[N+10];
int main()
{
    memset(a,0,sizeof(a));
    ch[1]=1;
    ch[2]=0;
    int i,j;
    for(i=2;i*i<=N;i++){
        if(!ch[i]){
            for(j=i*i;j<=N;j+=i){
                ch[j]=1;
            }
        }
    }
    for(i=2;i<=N;i++){//2853708
        if(!ch[i]){
            a[i]=1;
            for(j=2;j*i<=N;j++){
                a[i*j]++;
            }
        }
        a[i]+=a[i-1];
    }
    int t;
    cin>>t;
    while(t--){
        int c,b;
        cin>>c>>b;
        cout<

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

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

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