无平方因子的数(数论好题)

来源:互联网 发布:mysql source用法 编辑:程序博客网 时间:2024/06/09 17:15

题目:(题目跟分析基本都是书上,我只是敲几个代码跟大家分享)

无平方因子的数。 给出正整数n,m。区间[n,m]内  “无平方因子” 的数有多少个??

整数p无平方因子,当且仅当存在k>1,使得p是k^2的倍数.    1<=n<=m<=10^12;  n-n<=10^7

分析:

     直接枚举肯定会超时,

     使用的方法和筛选素质类似的,对于不超过 sqrt(m)的所有素数p,筛掉区间[n,m]内p^2的倍数

    以下是我的写代码(没有提交过OJ,但我尝试过一些数据,没有错。如果不妥还望指出

  

<span style="font-size:24px;">#include"stdio.h"#include"stdlib.h"#include"string.h" #include"math.h"const int maxn=100005;int p[maxn];int prim[maxn];int len=0;void prime(int m){memset(p,0,sizeof(p));int k=sqrt(m+0.5);p[1]=1; for(int i=2;i<=k;i++){if(!p[i])    for(int j=i*i;j<=m;j+=i)       p[j]=1;    }    len=0;    for(int i=1;i<=m;i++)   //将质数p[i]->prim[i]     {    if(!p[i])  //质数   prim[len++]=i;  //保存这些质数 }}bool is_ping(int k)//是否是平凡因子 {for(int i=0;i<len;i++)   if(k%(prim[i]*prim[i])==0)  //是平方因子       return false;    printf("%d ",k);    return true; }int main(){int n,m,cnt=0;scanf("%d%d",&n,&m);prime(m);for(int i=n;i<=m;i++)   if(is_ping(i))      cnt++;    printf("\n%d\n",cnt);return 0; } </span>

0 0
原创粉丝点击