这里写目录标题
D - ABC Conjecture
题意:
给定一个 c ( [1 , 1e18] ),问 c 是否满足以下性质:
①:将 c 分成 a 和 b,a + b = c
②:c > rad(abc)
注:rad(n) 为 n 的所有质因子相乘
分析:
注意:举了几个样例,发现 rad(abc) 和 rad( c ) 的差别很小,因此不考虑 a 和 b,只考虑 c,具体怎么证不会,以下只是对 rad 性质的讨论。
由 rad 的定义可知,如果 n 的所有因子(不包括 1 和 n)都是质因子,那么 rad(n) = n,例如 rad(6) = 2 x 3 = 6,rad(105) = 3 x 5 x 7 = 105,而 rad(18) = 2 x 3 = 6,因为 18 的质因子只有 2 和 3,因子却有 2,3,6,9。
可以看出来,将 n 分解成质因子的幂次方相乘的形式,如果没有一个质因子的幂次方 > 1 那么 n 的所有因子都是质因子,所以 rad(n) = n,所以必然是 no。
接下来讨论输出yes的情况:(以下 n 全部为 1e18 左右的数)
如果 n 的质因子只有两个:想要输出yes,n 只能是平方数,即这两个质因子相同
如果 n 的质因子超过两个:想要输出yes,必然要有找到某个质因子的平方能被 n 取模,所以会出现以下几种情况
① n 质因子全是1 ~ 1e6 范围内的,只需要将 1e6 之前的素数全部预处理出来,让 n 去取模素数平方就行了,只要有一个符合就可以输出 yes
② n 的质因子由 1e6 以上的质数和部分1 ~ 1e6 内的幂都是 1 的质数组成,那么想要输出 yes,n 只能由 1e6 以上质数的平方组成(只能是平方,不能是三次方及以上,因为这样就超过1e18了),所以只要把 1 ~ 1e6 以内的质因子都除掉,然后判读是否为平方数即可
步骤:
第一步:预处理出 1 ~ 1e6 内的所有素数
第二步:输入 c,然后判断 c 是否能取模 1 ~ 1e6 内的素数的平方,如果能,直接输出yes,如果不行,执行下一步
第三步:将 1e6 内的质因子全部除掉,一定要先判断此时 n 是否是 1,然后判断 c 是否是平方数,是则 yes,否则 no。
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int cnt;
LL pr[N];
bool st[N];
void get_Prime()
{
for(int i = 2; i <= N; i ++ )
{
if(!st[i]) pr[cnt ++ ] = i;
for(int j = 0; pr[j] <= N / i; j ++ )