P1574 超级数

其实就是求反质数,与这题很像,只不过数据范围变了。考虑打表即可。

关于反质数的更多信息,请看这里。

因为在 [1,1017][1, 10^{17}] 中的反质数其实是很少的,所以在输出答案时其实不需要二分,暴力即可。

#include <cstdio>
using namespace std;

#define int long long
int ans[] = {1, 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, 720, 840, 1260, 1680, 2520, 5040, 7560, 10080, 15120, 20160, 25200, 27720, 45360, 50400, 55440, 83160, 110880, 166320, 221760, 277200, 332640, 498960, 554400, 665280, 720720, 1081080, 1441440, 2162160, 2882880, 3603600, 4324320, 6486480, 7207200, 8648640, 10810800, 14414400, 17297280, 21621600, 32432400, 36756720, 43243200, 61261200, 73513440, 110270160, 122522400, 147026880, 183783600, 245044800, 294053760, 367567200, 551350800, 698377680, 735134400, 1102701600, 1396755360, 2095133040, 2205403200, 2327925600, 2793510720, 3491888400, 4655851200, 5587021440, 6983776800, 10475665200, 13967553600, 20951330400, 27935107200, 41902660800, 48886437600, 64250746560, 73329656400, 80313433200, 97772875200, 128501493120, 146659312800, 160626866400, 240940299600, 293318625600, 321253732800, 481880599200, 642507465600, 963761198400, 1124388064800, 1606268664000, 1686582097200, 1927522396800, 2248776129600, 3212537328000, 3373164194400, 4497552259200, 6746328388800, 8995104518400, 9316358251200, 13492656777600, 18632716502400, 26985313555200, 27949074753600, 32607253879200, 46581791256000, 48910880818800, 55898149507200, 65214507758400, 93163582512000, 97821761637600, 130429015516800, 195643523275200, 260858031033600, 288807105787200, 391287046550400, 577614211574400, 782574093100800, 866421317361600, 1010824870255200, 1444035528936000, 1516237305382800, 1732842634723200, 2021649740510400, 2888071057872000, 3032474610765600, 4043299481020800, 6064949221531200, 8086598962041600, 10108248702552000, 12129898443062400, 18194847664593600, 20216497405104000, 24259796886124800, 30324746107656000, 36389695329187200, 48519593772249600, 60649492215312000, 72779390658374400, 74801040398884800, 106858629141264000, 112201560598327200, 149602080797769600, 224403121196654400, 299204161595539200, 374005201994424000, 448806242393308800, 673209363589963200, 748010403988848000, 897612484786617600, 1122015605983272000, 1346418727179926400, 1795224969573235200, 2244031211966544000, 2692837454359852800};

signed main()
{
	int total = sizeof(ans) / sizeof(int), n;
	scanf("%lld", &n);
	while (n--)
	{
		int k;
		scanf("%lld", &k);
		for (int i = 0; i < total; i++)
		{
			if (ans[i] <= k && ans[i + 1] > k)
			{
				printf("%lld\n", ans[i]);
				break;
			}
		}
	}
	return 0;
}

提一个细节,打表后我们通常不知道数组有多大,我们可以用 vectorsize 函数统计大小,但是正常数组怎么获得数组元素个数呢?我们知道 C++ 中有这样的一个函数 sizeof(),在本题中,我们的打表数组是 ans,那么我们只需要用 sizeof(ans) / sizeof(long long) 即可求出数组元素个数。我的代码用了 #define int long long 所以直接写成 sizeof(int) 也是可以的。

posted @   HappyBobb  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示