Problem E - Mishka and Divisors

题目大意

 给n,k,给n个数,让你挑出m个数,使得m个数的乘积是k的倍数,输出最小的m。

如果有多个方案,输出sum最小的方案,(方案输出所选数的下标)

  数据范围:n <= 1000, k <= 10^12, ai<=10^12。


解题分析

dp[i][j]表示前i个数里选一些数,使得乘积是j的倍数的最小的m。

sum[i][j]表示最优方案对应的sum

可以得知,dp[i][j]=min(dp[i-1][j],dp[i-1] [ j/gcd(j,a[i])]    )

也就是要么不选a[i],如果选a[i]就在前面选前i-1个数取到j/gcd(j,a[i])的方案

记得相应的sum值也要更新。

这里的i就是1到n,而j应该是 k的约数们,可以知道k的约数个数大概是lg至上,sqrt未满的一个数量级,

粗略估计一下不超过1W ?  不过最后内存用了17X mb ...还好是cf

把k的约数们用map映射一下就好了

时间卡得紧,会T,注意到 求gcd(j,a[i])的时候,可以先令b[i]=gcd(k,a[i]),最后直接求gcd(j,b[i])能省一些时间

参考程序


 

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1005;ll aa[N];
ll bb[N];
ll prim[11000+50];
ll ok=0;
void f(ll k)
{for (ll i=1; i*i<=k; i++)if (k%i==0){prim[++ok]=i;if (k/i!=i)prim[++ok]=k/i;}
}
ll dp[N][11000+50];
ll sum[N][11000+5];
map <ll,int>idx;
ll gcd(ll a,ll b)
{if (!b) return a;else return gcd(b,a%b);
}
int main()
{ll n,k;cin>>n>>k;ll tmp=k;for (int i=1; i<=n; i++){scanf("%lld",&aa[i]);bb[i]=gcd(k,aa[i]);}if (k==1){printf("1\n");printf("%d\n",(min_element(aa+1,aa+1+n)-aa));return 0;}f(k);sort(prim+1,prim+1+ok);for (int i=1; i<=ok; i++)idx[prim[i]]=i;for (int j=2; j<=ok; j++){if (aa[1]%prim[j]==0)dp[1][j]=1,sum[1][j]=aa[1];else dp[1][j]=n+1;}dp[1][1]=0;for (int i=2; i<=n; i++){for (int j=1; j<=ok; j++){dp[i][j]=dp[i-1][j];sum[i][j]=sum[i-1][j];ll v=prim[j]/gcd(prim[j],bb[i]);int id=idx[v];if (dp[i-1][id]+1 < dp[i][j]  ){dp[i][j]=dp[i-1][id]+1;sum[i][j]=sum[i-1][id]+aa[i];}else if (dp[i-1][id]+1==dp[i][j]){if (sum[i][j]>sum[i-1][id]+aa[i])sum[i][j]=sum[i-1][id]+aa[i];}}}if (dp[n][ok]>n){printf("-1\n");return 0;}printf("%lld\n",dp[n][ok]);tmp=k;for (int i=n; i>=1; i--){int id=idx[tmp];if (dp[i][id]==dp[i-1][id]&& sum[i][id]==sum[i-1][id]) continue;printf("%d ",i);tmp/=gcd(tmp,bb[i]);}printf("\n");return 0;
}

cf/codeforces #365 E - Mishka and Divisors 数学+背包dp+gcd相关推荐

  1. [CF]Codeforces Round #529 (Div. 3)

    [CF]Codeforces Round #529 (Div. 3) C. Powers Of Two Description A positive integer xx is called a po ...

  2. cf/codeforces#369-E - ZS and The Birthday Paradox- 数学+gcd+逆元+勒让德定理

    引理: 勒让德定理 :http://baike.baidu.com/link?url=mqSXfFsk18D6zM7C1IVMh11M-3PaDRwCzqnB2ThJFymE98UuTGjmStD_u ...

  3. CodeForces - 893B Beautiful Divisors(数学,二进制)

    Description Recently Luba learned about a special kind of numbers that she calls beautiful numbers. ...

  4. 【Codeforces】1093C Mishka and the Last Exam

    http://codeforces.com/problemset/problem/1093/C 已知b[i]求a[i]和a[n-i+1],n是a数组中元素的个数,a数组的下标从1开始 输出b[1]的时 ...

  5. [CF]Codeforces Round #528 Div.2

    Div.2还是稳定四题啊,E题还是没得办法,就争取四题再快点吧. A(签到) 题意:写下s的第一个字符,在最右边写下s的第二个字符,在最左边写下s的第三个字符,以此类推生成字符串t,给出t,求s 找规 ...

  6. Codeforces 658D Bear and Polynomials【数学】

    题目链接: http://codeforces.com/contest/658/problem/D 题意: 给定合法多项式,改变一项的系数,使得P(2)=0,问有多少种方法? 分析: 暴力求和然后依次 ...

  7. CF Round Div.3-E Obtain a Permutation //数学规律

    题目链接 http://codeforces.com/contest/1294/problem/E 题意 给你一个 n × m n×m n×m 的矩阵(元素从 1 − n × m 1-n×m 1−n× ...

  8. Codeforces 963A Alternating Sum 【数论+数学】

    官方题解这个样子我觉得说得比较清楚.Z我们可以朴素的预处理出来(注意乘法膜),q的话考点在于[分数取膜]即 (a/b)%P = a* inverse of b %P 这就涉及到算b的逆元,我用的是欧几 ...

  9. 【CodeForces - 124C】Prime Permutation(数学,思维,小结论)

    题干: You are given a string s, consisting of small Latin letters. Let's denote the length of the stri ...

  10. 【CodeForces - 518D】Ilya and Escalator(概率dp,数学期望)

    题干: Ilya got tired of sports programming, left university and got a job in the subway. He was given ...

最新文章

  1. “榕树下·那年”移动app ( hybrid ) 开发总结
  2. linux系统结构,文件寻址,文件管理编辑,正则表达式
  3. 信号与系统奥本海姆第二版_【中山大学电通信通信号与系统考研】自编的两张小卡片带大家整理一下《奥本海姆·信号与系统》的知识架构...
  4. java生日快乐_Java八岁生日快乐!
  5. 免费的编程中文书籍索引(2018第三版)
  6. 新鲜出炉--Struct2、Hibernate3、Spring3框架搭建实战
  7. VC++调试方法和技巧
  8. eclipse 中使用字符流复制文件乱码解决
  9. Android中实现微信分享的功能
  10. OpenBSD身份验证绕过和权限提升漏洞
  11. 2022前端秋招面试题总结 阿里 腾讯 字节 百度 网易 京东 小红书 快手面试记录
  12. 激光雷达错位拼接技术
  13. 计组(七)存储系统:芯片地址
  14. 系统可打开最大文件数过小,导致CHECK_NRPE: Error - Could not complete SSL handshake
  15. Android加载图片导致内存溢出(Out of Memory异常)
  16. nRF52832 定时器REPEATED模式,导致异常重启的问题排查全过程
  17. 爬楼梯/青蛙跳台阶,不会还有人不会吧
  18. ejwt积分_菜鸡速通微积分:从十进制展开到数列、级数、幂级数、函数项级数...
  19. Jmeter多线程并发和压测结果分析
  20. 痞子衡嵌入式:MCUBootUtility v2.0来袭,i.MXRT1010哪里跑

热门文章

  1. 微信小程序:关注公众号组件自定义样式
  2. 已知ip地址如何算默认网关
  3. 《德鲁克管理思想精要》读书笔记11 - 管理你的下半生
  4. 使用Hourglass网络来理解人体姿态
  5. 阿里云获取手机验证码
  6. 无线鼠标,滚轮不灵,迟钝多转卡怎么办
  7. Discovery and auto register
  8. 往超级表格导入Excel,让数据处理不再繁杂!
  9. 拒绝焦虑状态:TA爱我吗?
  10. 计算机桌面备份在哪里,电脑备份文件在哪里