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

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

第一行包含两个整数 n d (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 __int64

const 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值