HDU 5750 数学题

随便推导下, 令y=xdy=xd, 如果ddyy的maximum positive proper divisor, 显然要求xxyy的最小质因子. 令mp(n)mp(n)表示nn的最小质因子, 那么就有x \le mp(d)xmp(d), 同时有y < ny<n, 那么x \le \lfloor \frac{n-1}{d} \rfloorxdn1. 于是就是计算有多少个素数xx满足x \le \min{mp(d), \lfloor \frac{n-1}{d} \rfloor}xmin{mp(d),dn1}.

dd比较大的时候, \lfloor \frac{n-1}{d} \rfloordn1比较小, 暴力枚举xx即可. 当dd比较小的时候, 可以直接预处理出答案. 阈值设置到10^6 \sim 10^7106107都可以过.

#include<bits/stdc++.h>
#define LL long long
#define bug puts("*********")
using namespace std;
const int N=1100000;
bool vis[N];
int num;
int sum[N];
int prim[N];
void init(){
    int m=1000000;
    memset(vis,1,sizeof(vis));
    vis[0]=0;
    vis[1]=0;
    for(int i=2;i<=1000;i++){
        if(vis[i]){
            for(int j=i*i;j<=m;j+=i){
                vis[j]=0;
            }
        }
    }
    num=0;
    for(int i=1;i<=1000000;i++){
        if(vis[i]){
            prim[num++]=i;
        }
    }
}
int main(){
    int t;
    int n,m;
    num=0;
    init();
    while(~scanf("%d",&t)){
            ///必须满足 使m为最大约数(除了本身) 
            ///就必须满足y=a*m  a一定<= m的最小质因子,否则就不能满足上面的条件了
            ///同时还要满足 y< n  即 y<=n-1 即a<= (n-1)/m 
            ///上述范围取最下即可
        while(t--){
            scanf("%d%d",&n,&m);
            int d=(n-1)/m;
            int a=100000000;///m的最小质约数
            for(int i=0;;i++){
                if(prim[i]>d)break;
                if(m%prim[i]==0){
                    a=prim[i];break;
                }
            }
           int cnt=0;
            for(int i=0;prim[i]<=a&&prim[i]<=d;i++){
                cnt++;
            }
            printf("%d\n",cnt);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值