坑爹dp,dp[i][j]表示前i个数是否能凑成乘积j..输出答案的时候根据当前的乘积和最近一次用到的数暴力没举出上一次的乘积...这tm都能过......
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=10010;
int size[maxn];
int b[maxn];
int n,m;
bool dp[maxn][1010];
bool vis[maxn];
void print(int p,int q)
{
if (p==0) return ;
bool ft=false;
for (int i=1; i<=m; i++)
if (dp[p-1][i] && ((i*b[p]) % m)==q)
{
ft=true;
print(p-1,i);
printf("%d ",p);
break;
}
if (!ft) print(p-1,q);
}
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
memset(dp,0,sizeof 0);
// memset(vis)
for (int i=1; i<=n; i++)
scanf("%d",&b[i]);
dp[0][1]=true;
for (int i=1; i<=n; i++)
for (int j=m; j>=1; j--)
if (dp[i-1][j])
{
dp[i][j]=true;
int tmp=j*b[i];
tmp%=m;
dp[i][tmp]=true;
}
bool ok=false;
for (int i=m-1; i>=2; i--)
{
if (dp[n][i])
{
printf("%d\n",i);
ok=true;
print(n,i);
break;
}
}
if (!ok) puts("1");
return 0;
}