题目大意:
定义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;
}