codeforces 703E Mishka and Divisors
题面
给出大小为(1000)的数组和一个数(k),求长度最短的一个子序列使得子序列的元素之积是(k)的倍数,如果有多个解输出元素和最小的序列。
(k)和数组元素的数量级都是(1e12)。
题解
(f[i][d])表示前(i)项是(d)的倍数的最优解。因为(d)只可能是(k)的因数,所以离散化一下(k)的因数即可。
过程中需要多次求(gcd),直接求会超时。需要先预处理(b[i]=gcd(a[i], k)),那么(gcd(a[i], k/d) -> gcd(b[i], k/d))