zoukankan      html  css  js  c++  java
  • hdu-5750 Dertouzos(数论)

    题目链接:

    Dertouzos

    Time Limit: 7000/3500 MS (Java/Others)    

    Memory Limit: 131072/131072 K (Java/Others)


    Problem Description
    A positive proper divisor is a positive divisor of a number n, excluding n itself. For example, 1, 2, and 3 are positive proper divisors of 6, but 6 itself is not.

    Peter has two positive integers n and d. He would like to know the number of integers below n whose maximum positive proper divisor is d.
     
    Input
    There are multiple test cases. The first line of input contains an integer T (1T106), indicating the number of test cases. For each test case:

    The first line contains two integers n and d (2n,d109).
     
    Output
    For each test case, output an integer denoting the answer.
     
    Sample Input
    9
    10 2
    10 3
    10 4
    10 5
    10 6
    10 7
    10 8
    10 9
    100 13
     
    Sample Output
    1
    2
    1
    0
    0
    0
    0
    0
    4
     
    题意:
     
    就是给一个n和一个d,问有多少个小于n的数的最大因子是d;
     
    思路:
     
    个数为min((n-1)/d,d')d'为d的最小质因子;
    素数筛,然后枚举最小质因子,当时忘加一个条件最后测的时候t了;
     
    AC代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    //#include <bits/stdc++.h>
    #include <stack>
    
    using namespace std;
    
    #define For(i,j,n) for(int i=j;i<=n;i++)
    #define mst(ss,b) memset(ss,b,sizeof(ss));
    
    typedef  long long LL;
    
    template<class T> void read(T&num) {
        char CH; bool F=false;
        for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
        for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
        F && (num=-num);
    }
    int stk[70], tp;
    template<class T> inline void print(T p) {
        if(!p) { puts("0"); return; }
        while(p) stk[++ tp] = p%10, p/=10;
        while(tp) putchar(stk[tp--] + '0');
        putchar('
    ');
    }
    
    const LL mod=1e9+7;
    const double PI=acos(-1.0);
    const int inf=1e9;
    const int N=1e5+10;
    const int maxn=500+10;
    const double eps=1e-8;
    
    
    int prime[N],sum[N],a[N],cnt=0,n,d;
    void Init()
    {
            sum[1]=0;
            For(i,2,N-maxn)
            {
                if(!prime[i])
                {
                    for(int j=2*i;j<N-maxn;j+=i)
                    {
                        prime[j]=1;
                    }
                    sum[i]=sum[i-1]+1;
                }
                else sum[i]=sum[i-1];
            }
            For(i,2,N-maxn)
            {
                if(!prime[i])a[++cnt]=i;
            }
    }
    
    inline int check(int x)
    {
        for(int i=1;i<=cnt;i++)
        {
            if(x%a[i]==0)return a[i];
            if((LL)a[i]*a[i]>x||a[i]>n/d)break;
        }
        return x;
    }
    int main()
    {       
            int t;
            read(t);
            Init();
            while(t--)
            {
                read(n);read(d);
                n--;
                int le=min(check(d),n/d);
                printf("%d
    ",sum[le]);
            }
            
            return 0;
    }
    
     
    

      

     
  • 相关阅读:
    Project Euler 613 Pythagorean Ant(概率+积分)
    Codeforces Beta Round #24 D. Broken robot (打表找规律)
    Codeforces Beta Round #17 D. Notepad (数论 + 广义欧拉定理降幂)
    bzoj4916-神犇和蒟蒻
    bzoj4176-Lucas的数论
    bzoj2788-Festival
    bzoj2839-集合计数
    bzoj1853-大包子的幸运数字
    bzoj3622-已经没有什么好害怕的的了
    bzoj2669-局部极小值
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5699905.html
Copyright © 2011-2022 走看看