【2016.5.21普及组模拟】约数国王(A king)
来源:互联网 发布:java 数据字典表设计 编辑:程序博客网 时间:2024/05/20 13:08
【2016.5.21普及组模拟】约数国王(A king)
(File IO): input:king.in output:king.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Description
数学的王国里,有一些约数国王……约数国王的定义是这样的:一个大于1的整数n,如果它约数的个数比1~n-1的每个整数的约数的个数都要多,那么我们就称它为约数国王。聪明的小明在奥数书上认识了它们,于是产生了一个问题:他想知道L到R之间一共有多少个约数国王?它们分别又是谁?
Input
输入文件只有一行,包含一个l,一个r,表示小明想知道的范围。
Output
只有一行,第一个数h,表示l~r内一共有多少个约数国王,接下来h个从小到大的数(为了防止国王们打架,你需要按顺序输出。),表示约数国王分别是谁。
Sample Input
1 100
Sample Output
8 2 4 6 12 24 36 48 60
Data Constraint
- 对于30%的数据,1<=l<=r<=200000。
- 对于50%的数据,1<=l<=r<=500000。
- 对于70%的数据,保证最大的约数国王的约数的个数不大于1000。
- 对于100%的数据,1<=l<=r, 并且保证l,r在64位整型以内,最大的约数国王的约数的个数不大于200000。
解题思路
首先,我们设一个c[i],表示因数个数(包括本数)为i,的最小正整数,那么对于一个数c[i],如果c[i]<任何一个c[i+k] (k为正整数),那么c[i]就是一个约数国王。
对于求出c[i],我们可以设P[i]为从小到大的质数中的第i个。这里用线性筛法可以求出来。
我们可以在设一个F[i,j]表示,有i个不同质因数构成,有j个因数的最小正整数。
那么,c[i]=Max{F[k,i]}。
求一个数的因子个数的公式:
若
证明:
若M是N的因数,
那么F的转移方程如此:
为什么要乘以
那我们来讨论一下j的取值范围,可想到
那么代码就很容(kun)易(nan)想象出来了
Codes:
const mxn=170000; num=200000; o=50; mx=trunc(ln(mxn)/ln(2)); limit=9223372036854775807;var f:array[1..mx,1..mxn]of qword; c:array[1..mxn]of qword; pr:Array[1..num] of longint; bz:array[2..num]of boolean; ans:array[1..mxn]of qword; tot,i,j,k,top:longint; l,r,x,t,max:qword; p:boolean;procedure GetPrimes;begin for i:=2 to num do begin if not bz[i] then begin inc(top); pr[top]:=i; end; for j:=1 to top do begin if pr[j]*i>num then break; bz[pr[j]*i]:=true; if i mod pr[j]=0 then break; end; end;end;function min(p,q:qword):qword;begin if p<q then exit(p) else exit(q);end;begin assign(input,'king.in'); reset(input); assign(output,'king.out'); rewrite(output); read(l,r); GetPrimes; for j:=1 to mxn do begin for i:=1 to mx do f[i,j]:=limit; c[j]:=limit; end; f[1,1]:=1; c[1]:=1; for i:=1 to 62 do begin f[1,i+1]:=f[1,i]<<1; c[i+1]:=f[1,i+1]; end; for i:=1 to mx-1 do for j:=1<<i to mxn do begin if f[i,j]<limit then begin t:=1; for k:=1 to mxn div j-1 do begin if limit/t<pr[i+1] then break; t:=t*pr[i+1]; if limit/t<f[i,j] then break; f[i+1,j*(k+1)]:=min(f[i+1,j*(k+1)],f[i,j]*t); c[j*(k+1)]:=min(c[j*(k+1)],f[i+1,j*(k+1)]); end; end; end; max:=limit; for i:=mxn downto 2 do begin if c[i]<max then begin max:=c[i]; if (l<=c[i]) and (c[i]<=r) then begin inc(tot); ans[tot]:=c[i]; end; end; end; write(tot); for i:=tot downto 1 do write(' ',ans[i]); close(output); close(input);end.
- 【2016.5.21普及组模拟】约数国王(A king)
- 2043. 【2016.5.21普及组模拟】约数国王(A king)
- jzoj 2043. 【2016.5.21普及组模拟】约数国王(A king)
- 初中OJ2043【2016.5.21普及组模拟】约数国王(A king)
- 约数国王(A king)
- OIBH杯第三次模拟赛(普及组)Problem 3 : maxsum 最大约数和
- 【2016.5.21普及组模拟】博物馆
- 2042. 【2016.5.21普及组模拟】SuperPow
- 2017.1.13【初中部 】普及组模拟赛C组 maxsum 最大约数和 题解
- OIBH杯第三次普及组模拟赛T3 最大约数和
- [POJ1364] 国王king
- 国王游戏(贪心+模拟)
- 2041. 【2016.5.21普及组模拟】魔方工厂
- jzoj 2040. 【2016.5.21普及组模拟】博物馆
- jzoj 2041. 【2016.5.21普及组模拟】魔方工厂
- 【差分约束】king(国王)解题报告 …
- 洛谷1377 M国王 (SCOI2005互不侵犯King)
- noip1996 乘法运算 - 普及组 (模拟)
- 我有10个职场经验,价值100万,但今天免费|咪蒙
- 笔记9列表生成器
- 判断某一区域是否为空
- 【Leetcode】之Add Binary
- 图书馆管理系统
- 【2016.5.21普及组模拟】约数国王(A king)
- Python DM Learning Intro
- MySQL修改表结构及SQL性能优化
- nginx-tomcat负载均衡redis-session共享,静态资源分离
- 通知栏Notification使用
- mysql 默认引擎innodb 初探(三)
- 走近XML(1)
- php判断一个字符串包含另一个字符串
- 六个可以替代传统事务解决并发问题的建议