http://codeforces.com/contest/703/problem/E

题意:给定一个最多个数的序列,从中选出最少个数的数字,使得他们的乘积是k的倍数,若有多种选择方式,输出选出数字和最小的一种,若有多种,输出任意一种。

动态规划,dp[i][j]表示从前i个数里选,所得乘积是j的倍数。显然dp[i][j]=max(dp[i-1][j],dp[i-1][j/gcd(j,a[i])])。由于k可能很大,所以只需令j分别等于k的每个约数即可。

确定k的约数的时候令i从1到sqrt(k)循环判断,注意由于k很大,这里的i要使用longlong。

#include<bits/stdc++.h>
using namespace std;
#define ft first
#define sd second
#define mp make_pair
long long a[], k, f[], b[];
int fc, n;
pair<int, long long> dp[][];
map<long long , int> e;
int main()
{
//freopen("input.txt", "r", stdin);
scanf("%d%I64d", &n, &k);
long long t = k;
for (int i = ; i <= n; i++)
{
scanf("%I64d", &a[i]);
b[i] = __gcd(k, a[i]);
t /= __gcd(t, a[i]);
}
if (t != )
{
printf("-1\n");
return ;
}
if (k == )
{
printf("1\n%d\n", (int)(min_element(a + , a + n + ) - a));
return ;
}
e.clear();
fc = ;
for (long long i = ; i * i <= k; i++)
{
if (k % i != ) continue;
f[fc++] = i;
if (i * i != k) f[fc++] = k / i;
}
sort(f, f + fc);
for (int i = ; i < fc; i++)
e[f[i]] = i;
for (int i = ; i < fc; i++)
dp[][i] = mp(n + , );
dp[][] = mp(, );
for (int i = ; i <= n; i++)
for (int j = ; j < fc; j++)
{
dp[i][j] = dp[i - ][j];
long long v = e[f[j] / __gcd(f[j], b[i])];
if (dp[i][j] > mp(dp[i - ][v].ft + , dp[i - ][v].sd + a[i]))
dp[i][j] = mp(dp[i - ][v].ft + , dp[i - ][v].sd + a[i]);
}
printf("%d\n", dp[n][fc - ].ft);
t = k;
for (int i = n; i > ; i--)
{
if (dp[i][e[t]] == dp[i - ][e[t]]) continue;
printf("%d ", i);
t /= __gcd(t, b[i]);
}
printf("\n");
//fclose(stdin);
return ;
}

最新文章

  1. select初始化添加option,通过标签给出回显值,由于回显值和初始化值option中有一个值重复,去重等问题!
  2. 深度浅出immutable.js
  3. JavaScript的事件对象_键盘事件
  4. 流控panabit的安装及配置
  5. 关于conversation generation的论文笔记
  6. poj 3046 Ant Counting
  7. mysql给表添加外键并查询
  8. 【转载】CSS font关键字属性值的简单研究
  9. LibreOJ β Round #2 F. 数学上来先打表
  10. JS正则四个反斜杠的含义
  11. redis简介与持久化
  12. session 存到memcache里
  13. Oracle Base64加解密
  14. ASP.NET WebApi 基于JWT实现Token签名认证
  15. ios 适配iOS11&amp;iPhoneX的一些坑
  16. 使用promisify解决fs的回调地狱问题
  17. Unity shader学习之屏幕后期处理效果之边缘检测
  18. python中的print()、str()和repr()的区别
  19. asp.net使用动态模版导出word
  20. bzoj千题计划189:bzoj1867: [Noi1999]钉子和小球

热门文章

  1. Android 毛玻璃效果
  2. myeclipse相关
  3. 1.Windows安装PostgreSQL
  4. 解决css样式被内置样式覆盖的问题
  5. h5 range应用 透明度+RGB
  6. android 入门-安装环境
  7. python解析RSS(feedparser)
  8. java BigInteger使用
  9. POJ 1061 同余方程
  10. mysql无法远程连接的解决方法