Educational Codeforces Round 9 D
这个题的意思是给你一串数字序列, 和一个数m, 然后你选一个最长的序列使得这个序列的lcm小于等于m, 由于m<=10^6, 因此我们可以定义dp[i]为序列中倍数为i的元素个数, 然后倒着推一遍即可, 代码如下:
#include <bits/stdc++.h> using namespace std; int n, m; int a[1000000 + 100]; int dp[1000000 + 100]; int main() { scanf("%d%d", &n, &m); for(int i=0; i<n; i++){ scanf("%d", &a[i]); if(a[i]<=m) dp[a[i]]++; } for(int i=m; i>=1; i--) { if(dp[i]) for(int j=2*i; j<=m; j+=i) dp[j]+=dp[i]; } int lcm=1, maxnum=0; //答案中的元素个数为0的时候lcm=1 for(int i=1; i<=m; i++) { if(dp[i] > maxnum) maxnum = dp[i], lcm = i; } printf("%d %d\n", lcm, maxnum); int tpnum = 0; for(int i=0; i<n; i++) { if(lcm%a[i] == 0) { printf("%d", i+1); tpnum ++; if(tpnum == maxnum) printf("\n"); else printf(" "); } } return 0; }