HDU 5750 Dertouzos(思路题)

来源:互联网 发布:群优化 编辑:程序博客网 时间:2024/05/22 14:24

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5750

题意:给定n、d,在(1,n)范围(不包括n)内寻找最大因子是d的总个数 

分析:最大因子是d,那它一定是d的倍数,即在d的素数倍中寻找就行了。

 n--; ans=min(n/m,m);ans=min(ans,b[m]);//b[m]表示m的最小素因子,即找小于等于ans的整数中有多少个素数即可.

注意当d不是素数的时候,这时就要找它的最小素因子。当时比赛的时候就卡在了这里,不知道怎么去找,错误的思路就是一直想方法存起来,但结果总是RE,后来发现直接暴力在素数中找也是可以的,并不会超时。

CODE:

#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>#include<stdlib.h>#include<math.h>#include<map>#include<queue>using namespace std;typedef long long LL;#define INF 0x3f3f3f3fconst int maxn=1000001;const int mod=1000006;bool p[maxn];int pos[maxn];int k=0;void init(){    memset(pos,0,sizeof(pos));    memset(p,true,sizeof(p));    p[0]=p[1]=false;    for(int i=2; i<maxn; i++)//打表筛素数     {        if(p[i])        {    pos[k++]=i;          for(int j=i+i; j<maxn; j+=i)            p[j]=false;        }    }}int main(){    int t,n,m;    k=0;    init();    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        if(m>=(n+1)/2)//如果m>(n+1)/2,就找不到最大素因子为m的数了         printf("0\n");        else//否则暴力寻找         {        int ans=0;        for(int i=0;;i++)        {        if(m*pos[i]>=n||m<pos[i]||m%pos[i]==0)        {        ans=i;        break;        }        }        if(m*pos[ans]>=n||m<pos[ans])//如果是这两个条件跳出,就多找了一个         ans--;        printf("%d\n",ans+1);        }      }    return 0;}


0 0