SDUT 2021 Autumn Team Contest 25th

这里写目录标题

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 ++ )
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值