[jzoj2538]【NOIP2009TG】Hankson 的趣味题

Description

这里写图片描述

0<NUM<21010

Solution

比较简单的数论

基本思路:考虑 x 的每个质因数可以取多少个 运用乘法原理即可

显然的 P | x 的充要条件是 P | b1

那么 对于一个质数 P

设 A1 表示 Pf|a1 时最大的 f 以此类推

感受一下

A0=A1 时 x 中至多有 A1 个 P

A0>A1 时 x中恰好有 A1 个 P

A0<A1 时 无解

同样的 对于 B0B1 我们一样的方式处理

注意每一个 b1 的质因数都要被考虑

Code

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define fo(i,x,y) for (int i=(x);i<=(y);++i)
#define fd(i,x,y) for (int i=(x);i>=(y);--i)
#define oo 2139062143
using namespace std;
const int NUM=2000020000,SQT=50500;
int T,a0,a1,b0,b1;
int pri[SQT],bz[SQT];
void gtpri()
{
    bz[1]=1;
    fo(i,2,50000)
    {
        if(!bz[i]) pri[++pri[0]]=i;
        fo(j,1,pri[0])
        {
            if(i*pri[j]>=50000)break;
            bz[i*pri[j]]=1;
            if(!(i%pri[j]))break;
        }
    }
}
int calc(int x,int y)
{
    int rt=0;
    while(!(y%x)) y/=x,++rt;
    return (rt);
}
int work(int P)
{
    int c0=calc(P,a0),c1=calc(P,a1),d0=calc(P,b0),d1=calc(P,b1);
    int tl=0,tr=oo;
    if(c0<c1||d0>d1) return 0;
    if(c0==c1) tl=c1;
    if(d0==d1) tr=d1;
    if(c0>c1)
    {
        if(!(c1>=tl&&c1<=tr)) return 0;
        else tl=tr=c1;
    }
    if(d0<d1)
    {
        if(!(d1>=tl&&d1<=tr)) return 0;
        else tl=tr=d1; 
    }
    return(tr-tl+1);
}
int main()
{
    gtpri();
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d",&a0,&a1,&b0,&b1);  
        long long ans=1;
        fo(i,1,pri[0])
        if(b1%pri[i]==0)
        {
            ans*=work(pri[i]);
            while(b1%pri[i]==0) b1/=pri[i];
            if(!ans||(pri[i]*pri[i]>=b1))break;
        }
        if(b1!=1)ans*=work(b1);
        printf("%lld\n",ans);
    }   
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值