zoukankan      html  css  js  c++  java
  • hdu_5750_Dertouzos(线性筛)

    题目连接:hdu_5750_Dertouzos

    题意:

    给你一个n,一个d,问你比n小的数中有多少个数的最大的因子为d,比如6有因子1 2 3 最大的为3

    题解:

    当时比赛做这题的时候没考虑常数的优化,过了初测,然后FST了,卧槽。。。

    这题仔细观察就可以发现我们只需要找一个数s,s*d比n小,且s不大于d的最小的质因数,这样才能使s*d这个数的最大的因子为d。然后我们就用线性筛 先筛出2W的素数,其实应该筛到33333的,不过我测试了数据2W也能过,然后就扫一遍就行了

     1 #include<cstdio>
     2 #define F(i,a,b) for(int i=a;i<=b;++i)
     3 
     4 int primes[30000],tot=0,N=20000;
     5 bool vis[20001];
     6 void Euler(){
     7     F(i,2,N){
     8         if(!vis[i])primes[++tot]=i;
     9         F(j,1,tot){
    10             if(i*primes[j]>N)break;
    11             vis[i*primes[j]]=1;
    12             if(i%primes[j]==0)break;
    13         }
    14     }
    15 }
    16 int main(){
    17     Euler();
    18     int t,n,d;
    19     scanf("%d",&t);
    20     while(t--)
    21     {
    22         scanf("%d%d",&n,&d);
    23         int mi=-1,tp=(n-1)/d,ans=0;
    24         for(int i=1;i<tot;i++)
    25         {
    26             if(primes[i]>tp)break;
    27             ans++;
    28             if(d%primes[i]==0)break;//如果d是当前素数的倍数,那么下一个素数肯定比这个素数大,所以直接退出
    29         }
    30         printf("%d
    ",ans);
    31     }
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    AOP的实现原理——动态代理
    反射
    代理模式
    sprig——jar包
    spring事务管理
    [c++基础]3/5原则--拷贝构造函数+拷贝赋值操作符
    [c++面试准备]--vector对象是如何增长的
    c++面试须知
    redhat--1
    kvm配置虚拟机[待整理]
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5699947.html
Copyright © 2011-2022 走看看