[数论]jb数2

来源:互联网 发布:英语单词书写软件 编辑:程序博客网 时间:2024/05/22 17:15

题目大意:

定义jb数为:一个数分解质因数后,所有质因子的和。

例如jb(4)=4,jb(5)=5,jb(6)=5等。

现给出一个范围,求出这个范围内jb数的和。

由于这个数可能过大,只需要求出这个数模1919的值就可以了。


solution:

已知一个数a和质数b,如果a % b=0,那么Jb[a]=b+Jb[a / b]

可以类似筛法的求出每个数是由哪个质数的到的,再次循环即可求出Jb[x]

维护前缀和,输出答案。

输入输出都好大,输入输出挂都加上了  = =


#include<iostream>#include<cstdio>#include<cctype>#include<cstring>using namespace std;const int M=1000010;long long s[2*M],g[2*M],d[2*M];inline int Init(){    char c=getchar();    while(!isdigit(c))c=getchar();    int x=0;    while(isdigit(c))    {        x=x*10+c-'0';        c=getchar();    }    return x;}int buf[10];inline void Out(int i){    int p=0;    if(i==0)buf[p++]=0;    else    while(i)    {        buf[p++]=i%10;        i/=10;    }    for(int j=p-1;j>=0;--j)putchar('0'+buf[j]);}int main(){    int T=Init();    for(int i=2;i<=M;++i)g[i]=i;    for(int i=2;i<=1001;++i)    if(g[i]==i)for(int j=2;j<=M/i+1;++j)g[i*j]=i;    for(int i=2;i<=M;++i)    {        if(g[i]==i)d[i]=i;        else d[i]=d[i/g[i]]+g[i];        s[i]=s[i-1]+d[i];    }    ios::sync_with_stdio(false);    while(T--)    {        int l=Init(),r=Init();        Out((s[r]-s[l-1])%1919);        putchar('\n');    }    return 0;}