题目大意:给出一个用m个ai乘起来表示的n,求出一个最大的k,使得存在一个d,使得d^k|n,并求出在这种情况下符合条件的d的个数
我们想求得答案,很自然的想要进行质因数分解,想要把n进行质因数分解,显然要把ai进行质因数分解
但是由于ai有点大,直接根号ai全部分解显然是不现实的
那么我们不妨考虑先筛出10^6以内的所有素数,然后用这些素数来筛ai
这样筛完之后,对于所有的ai,只可能有四种情况:
1.被筛干净变成了1,这样我们就算处理完了这个数
2.被筛成了一个大于10^6的大质数p,我们可以用Miller-Rabin来检验剩下的数是否属于这种情况
3.被筛成了一个大于10^6的大质数p的平方,我们可以直接开根来判断是否属于这种情况
4.被筛成了两个大于10^6的大质数p,q的乘积
由于10^6以内的素数我们全都筛过了,所以一定不会出现剩下的数包含三个可重质因子的情况
前三种情况我们可以非常(轻松)地解决,现在考虑最后一种情况
若存在一个大质数p在n中出现2次以上,则其必然至少在两个这种形态的数中出现(上面的情况暂时不考虑)
所以我们可以去重之后对剩下的ai两两做gcd,把gcd不为1的拿出来,这是可能出现多次的素数,剩下的大质数我们不需要知道他们具体是几,只需要知道有多少个这样的数,他们的出现次数均为1就好了
统计出n中每个质数出现了多少次后,我们可以轻松算出k,设质数出现次数=k的有x个,则第二问答案为2^x-1
这里可能会爆longlong,所以要用高精度
具体实现上可能会有一些细节问题,参见代码
#include
#include
#include
#include
#include