幸运数

幸运数(lucky)

【题目描述】

         如果一个正整数的所有质因子都小于等于m且每种质因子个数都为奇数,则称这个数为幸运数,例如当m=3时,6是幸运数而5不是,12也不是幸运数(2这个质因子有偶数个)。

给定n,m,求小于等于n的幸运数有多少个。

【输入格式】

         一行2个数,表示n,m。

【输出格式】

         一行1个数,表示幸运数的个数。

【样例输入】

10  3

【样例输出】

5

【样例解释】

分别是1,2,3,6,8

【数据范围与约定】

对于20%的数据,n<=10^4,m<=10^4;

对于40%的数据,n<=10^7,m<=10^5;

对于80%的数据,n<=10^8,m<=10^6;

对于100%的数据,n<=10^9,m<=10^6。

题解:这题也没有什么特别的方法,直接一个DFS进行暴力模拟就可以了。

Code:

var
  i,j,k,n,m,x,y,ans,cnt:longint;
  b:array[0..1000005] of boolean;
  f:array[0..80005] of longint;
function ef(k,s:int64):longint;
var l,r,mid,ans:longint;
begin
  l:=k;r:=cnt;ans:=-1;
  while l<=r do
  begin
    mid:=(l+r) div 2;
    if f[mid]*s<=n then
    begin
      ans:=mid;l:=mid+1;
    end else r:=mid-1;
  end;
  exit(ans);
end;
procedure dfs(k,s:int64);
var t,p:int64;i:longint;
begin
  if k>cnt then
  begin
    inc(ans);
    exit;
  end;
  if s*f[k]*f[k]>n then
  begin
    t:=ef(k,s);
    if t<>-1 then ans:=ans+t-k+1;
    inc(ans);
    exit;
  end;
  dfs(k+1,s);
  p:=f[k];
  for i:=1 to 50 do
  begin
    if p*s<=n then dfs(k+1,p*s) else break;
    p:=p*f[k]*f[k];
  end;
end;
begin
  assign(input,'lucky.in');reset(input);
  assign(output,'lucky.out');rewrite(output);
  readln(n,m);
  fillchar(b,sizeof(b),true);
  b[1]:=false;
  for i:=2 to m div 2 do
    if b[i] then
      for j:=2 to m div i do b[i*j]:=false;
  for i:=1 to m do
    if b[i] then
    begin
      inc(cnt);
      f[cnt]:=i;
    end;
  dfs(1,1);
  writeln(ans);
  close(input);close(output);
end.

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack-Oran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值