代码背诵:最大公约数,exgcd,KMP,线段树
1 线段树
区间求和 区间修改 带lazy标记
2 1016 完美数
题意
定义:完美数(K)满足:(K)的所有不包含自己的因数({p_i}(iin [1,x]))满足
[K=sum_{i=1}^x p_i
]
则叫做完美数。
实际上所有的完美数都是偶数。欧几里得证明一个偶数如果满足以下形式就是完美数:
[K=2^{p-1}(2^p-1)
]
其中(p)和(2^p-1)都是质数。
欧拉证明了欧几里得定理的逆定理,每个偶数完美数都是欧几里得形式。
前四个完美数是6,28,396,8128.相应的(p=2,3,5,7)
给定一些整数(p),不一定是质数.请你判断满足欧几里得形式的数对应的是不是完美数。
不超过(2^{33})。
题解
分别判断(p)和(2^p-1)是否是质数。使用快速幂和素数判断。
未AC原因
题目理解有误。可以不必判断质因数分解,而直接考虑素数的问题。
代码
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
int p;
int ksm(int x,int y)
{
if (y == 1) return x;
int tp = ksm(x,y >> 1);
if (y & 1) return tp * tp * x;
return tp * tp;
}
int main()
{
scanf("%d",&p);
if (p == 1)
{
printf("No
");
return 0;
}
int xz = sqrt(p);
for (int i = 2;i <= xz;i++)
{
if (p % i == 0)
{
printf("No
");
return 0;
}
}
int itp = ksm(2,p) - 1;
xz = sqrt(ksm(2,p) - 1);
for (int i = 2;i <= xz;i++)
{
if (itp % i == 0)
{
printf("No
");
return 0;
}
}
printf("Yes
");
return 0;
}
3 1019
题意
找到一个有(n)个因子的最小的正整数。输出。
题解
因为最终答案是小于50000的,所以我们可以从2开始枚举答案,遇到第一个有n个因子的数就输出即可。
理解
枚举没有考虑
代码
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
if (n == 1) // 1特判一下。
{
printf("1");
return 0;
}
for (int i = 2; i <= 50000; i++)
{
int cnt = 0;
for (int j = 2; j * j < i; j++)
{
if (i % j == 0)
{
cnt++;
}
}
cnt <<= 1;
if ((int)sqrt(i) * (int)sqrt(i) == i)
{
cnt += 3;
}
else
{
cnt += 2;
}
if (cnt == n)
{
printf("%d", i);
return 0;
}
}
return 0;
}