给出n,m。从n个数中选几个相乘,再%m。能取到的最大值和取法。
用dp[i][j]记录前i行能否取到j这个结果。那么dp[i][j]至少等于dp[i-1][j],还能等于所有的dp[i-1][j]*arr[i]%m。要输出方案,那么如果在记录的过程中,j*arr[i]%m在i-1没出现说明是新得出的,且一定取了i号,那么p[j*arr[i]%m]=j。输出结果时往上回溯。
//#pragma comment(linker,"/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #include #include
res; int cur=pos; cout<
< =1;--i) { if(vst[i][cur]^vst[i-1][cur]) { res.push_back(i); cur=p[cur]; } } sort(res.begin(),res.end()); for(int i=0;i