P1463 [POI2002][HAOI2007]反素数
Posted garen-wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1463 [POI2002][HAOI2007]反素数相关的知识,希望对你有一定的参考价值。
打表出奇迹!!!
这道题暴力当然能做,但是(n==2 imes 10 ^9)就不允许暴力了。
让我们打表出奇迹!!!
首先先了解一下如何有效率地算出一个数的约数个数:
最暴力的是从(1)枚举到(n),每一次++。
优化一点的就是只枚举到(sqrt{n})。但是还是很慢的。
我们了解一下传说的约数个数定理:
对于一个正整数(n),由唯一分解定理可以分解为(p_1^{a_1} imes p_2^{a_2} imes ... imes p_i^{a_i})。
那么这个约数个数就是((a_1+1)(a_2+1)...(a_i+1))。
所以我们就能够用比较好的时间复杂度写出这个打表程序了。
因为唯一分解定理需要的是质数,所以我们就能除以当前的质数就除,不能除就下一个,直到为1为止。
因为前10个质数的积已经大于2e9,所以直接人工打出前10个质数。
这是打表程序:
#pragma optimize(2) //我也学会了这个手动O2
#include<cstdio>
const int maxn = 2000000005;
const int N = maxn - 5;
const int prime[] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29};// 10
int maxv;
int main()
{
freopen("out.txt", "w", stdout);
for(int i = 2; i <= N; i++)
{
int temp = i, ans = 1;
for(int j = 1; j <= 10; j++)
{
int cnt = 0;
while(temp % prime[j] == 0)
{
temp = temp / prime[j];
cnt++;
}
ans = ans * (cnt + 1);
if(temp == 1) break;
}
if(ans > maxv)
{
printf("%d
", i);
maxv = ans;
}
}
return 0;
}
这份代码运行完是有180s左右,比上面第二种算法快了不知道多少。
然后我再去转换一下,把这些数字用C++输出成一个常量数组,就成为我们的表了。
然后主程序就非常无脑了:
#include<cstdio>
int g[] = {0, 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};
// 67
int main()
{
int n; scanf("%d", &n);
for(int i = 1; i <= 67; i++)
{
if(g[i] > n && g[i - 1] <= n)
{
printf("%d
", g[i - 1]);
return 0;
}
}
printf("%d
", g[67]);
return 0;
}
以上是关于P1463 [POI2002][HAOI2007]反素数的主要内容,如果未能解决你的问题,请参考以下文章
[POI2002][HAOI2007]反素数 数论 搜索 好题
[POI2002][HAOI2007]反素数(Antiprime)
Luogu P1463 [HAOI2007]反素数ant:数学 + dfs反素数
[HDU1695]GCD + [HAOI2011]Problem b + [POI2007]ZAP-Queries莫比乌斯反演