题目:
209-2020 ICPC Asia Xuzhou Regional Onsite Contest
E. Multiply
题意:
找到最大的 i 使得 z*x^i 是 y! 的因子
分析:
题目有说:a1+a2+......+an < y,那么 z 一定是 y!的因子[1],所以答案一定存在;如果 a 是 b 的因子,那么必有:将两个数唯一分解后,a 的每个质因子的幂 <= b 相同的质因子的幂;那么做法就呼之欲出了,将 x 唯一分解后,找到每个质因子对应的最大的 i,然后取最小值便是最后的答案;x 的范围比较大,套个 Pollard_rho 模板就做完了
[1]简单证明:
还是考虑两边质因子分解,首先 y!包含 z 具有的所有质因子,那么只用看每个质因子的幂;设 z 分解后的某一个质因子为 p, z 中 p 的幂为(阶乘分解质因子来算):
y!分解后 p 的幂为:
又有:
得证:
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e5+16;
LL x,y,a[maxn];
struct BigIntegerFactor{
const static int maxm = 1e6+16;
LL prime[maxm],p[maxm],fac[maxm],sz,cnt; //多组输入注意初始化cnt = 0
inline LL mul(LL a,LL b,LL mod){ //WA了尝试改为__int128或慢速乘
if(mod <= 1000000000) return a * b % mod;
return (a*b-(LL)