[DP][数学]JZOJ 3318 Brunhilda的生日
分析
不难发现,当一个数在[x,x+prime[i])(x|prime[i])中时,它可以由x转移过来
那我们考虑贪心,对于这个x|prime[i],我们记录最大的可被x整除的prime,然后用两个端点跳来跳去,因为越前面转移过来的越优
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; const int N=1e7+100; int m,q; int p[N/100],mx[N],f[N]; void Prime() { for (int i=1;i<=m;i++) for (int j=1;j<=(N-100)/p[i];j++) mx[j*p[i]]=p[i]; } int main() { scanf("%d%d",&m,&q); for (int i=1;i<=m;i++) scanf("%d",&p[i]); Prime();mx[0]=p[m]; for (int l=0,r=1;l<r&&r<=N-100;l++) { if (!mx[l]) continue; for (;r<=min(l+mx[l]-1,N-100);) f[r++]=f[l]+1; } for (;q;q--) { int qq; scanf("%d",&qq); printf((f[qq]?"%d\n":"oo\n"),f[qq]); } }
在日渐沉没的世界里,我发现了你。