BestCoder Round #84 &&HDU 5750 Dertouzos 【数论+暴力】

来源:互联网 发布:世纪桥软件 编辑:程序博客网 时间:2024/04/30 21:06

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

—————————————–.

Dertouzos Accepts: 76 Submissions: 1357
Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
问题描述
正整数x称为n的positive proper divisor, 当且仅当x|n并且1x<n. 例如, 1, 2, 和3是6的positive proper divisor, 但是6不是.

Peter给你两个正整数nd. 他想要知道有多少小于n的整数, 满足他们的最大positive proper divisor恰好是d.
输入描述
输入包含多组数据, 第一行包含一个整数T(1T106)表示测试数据组数. 对于每组数据:

第一行包含两个整数nd(2n,d109)

输出描述
对于每组数据, 输出一个整数.
输入样例
9
10 2
10 3
10 4
10 5
10 6
10 7
10 8
10 9
100 13
输出样例
1
2
1
0
0
0
0
0
4

—————————————————-.

题目大意: 自己看

解题思路:
首先要明确的是 N*M的最大因子为N的时候只有M为素数 且M<=N的最小素因子的时候 ;
试想 N=pa11pa22pa33pa44pann;(p[i]<p[i+1])
如果M不是素数那么M=X*Y,N*M的因子中 就多了N*X和N*Y 均比N大 所以不成立
如果M>p1 (假设所有的ai均为1)那么N*M的因子中 就多了 Mp2p3p4pn 一定大于 p1p2p3p4pn 所以也不成立 至于某个ai>1的时候同理
也不行

所以先打出sqrt(1e9)内的所有素数
然后暴力找即可

   for(int i=0;i<k;i++)    {        if(d*prime[i]>=n)   break;        sum++;        if(d%prime[i]==0)   break;    }

k值不到1e4 加上题目3500ms 就能过了

附上本题代码

———————————————————-.

#include <iostream>#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>using namespace std;#define LL __int64const LL MOD = 1e9+7;const LL INF = 0x3f3f3f3f;int Is_or[101010];int prime[10000];int k=0;void Prime(){    memset(Is_or,1,sizeof(Is_or));    int n=100000;    for(int i=2;i<=n;i++)        if(Is_or[i])        {            prime[k++]=i;            for(int j=i+i;j<=n;j+=i)                Is_or[j]=0;        }    return ;}int primeproper(int num,int n){    int sum=0;    for(int i=0;i<k;i++)    {        if(num*prime[i]>=n)   break;        sum++;        if(num%prime[i]==0)   break;    }    return sum;}int main(){    Prime();    printf("%d  %d  ",prime[k-1],prime[4229]);    printf("%d\n",k);    int t;    scanf("%d",&t);    while(t--)    {        int n,m;        scanf("%d%d",&n,&m);        int d = primeproper(m,n);        printf("%d\n",d);    }    return 0;}
0 0
原创粉丝点击