BOJ 319 3230391's easy problem

来源:互联网 发布:python中文编码问题 编辑:程序博客网 时间:2024/05/01 12:43

考察素因子分解+打表,比如6=2*3,即2的x次方*3的y次方,x可以取0或1,3可以取0或1,故2*2=4种因子

/*                for(int i=2;i<num;i++)    {for(int j=prim[i-1];1;j+=2){int k,l;for(k=0,l=sqrt(j);prim[k]<=l&&j%prim[k];k++);if(prim[k]>l){prim[i]=j;break;}}}    */#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<ctime>#define N 1000005int n;int prim[1000005];int a[1000005];int f[1000005];int s[1000005];int main(){    memset(f,0,sizeof(f));    int l=(int)sqrt(N*1.0);    for(int i=2;i<=l;i++)        if(a[i]==0)            for(int j=i;i*j<=N;j++)                a[i*j]=1;    int num=0;    for(int j=2;j<=N;j++)        if(a[j]==0)            prim[num++]=j;    //对f进行打表    f[1]=1;for(int i=2;i<=N;i++){int tmp=i,mul=1;int len=(int)sqrt(i*1.0);//len如果不独立出来会超时,这一点要记清楚    for(int j=0;prim[j]<=len;j++){ //因为i的素因子最多为sqrt(i)(除了本身为素数的情况),所以加上prim[j]<=len这一句int cnt;    if(tmp%prim[j]==0){cnt=1;    while(tmp%prim[j]==0){    cnt++;    tmp/=prim[j];}mul*=cnt;}}if(tmp!=1) mul*=2;f[i]=mul;}s[0]=0;for(int i=1;i<=N;i++)    s[i]=s[i-1]+f[i];    while(scanf("%d",&n)==1&&n)        printf("%d\n",s[n]);    return 0;}


原创粉丝点击