20200909 day4 刷题记录

代码背诵:最大公约数,exgcd,KMP,线段树

1 线段树

区间求和 区间修改 带lazy标记

2 1016 完美数

题意

定义:完美数\(K\)满足:\(K\)的所有不包含自己的因数\(\{p_i\}(i\in [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\n");
return 0;
}
int xz = sqrt(p);
for (int i = 2;i <= xz;i++)
{
if (p % i == 0)
{
printf("No\n");
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\n");
return 0;
}
}
printf("Yes\n");
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;
} 
posted @ 2020-09-08 15:24  刘子闻  阅读(105)  评论(0编辑  收藏  举报