幸运数(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.
标签:begin,cnt,end,mid,longint,ans,幸运 From: https://blog.51cto.com/u_15888102/5878378