cf/codeforces #365 E - Mishka and Divisors 数学+背包dp+gcd
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相关推荐
- [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 ...
- cf/codeforces#369-E - ZS and The Birthday Paradox- 数学+gcd+逆元+勒让德定理
引理: 勒让德定理 :http://baike.baidu.com/link?url=mqSXfFsk18D6zM7C1IVMh11M-3PaDRwCzqnB2ThJFymE98UuTGjmStD_u ...
- CodeForces - 893B Beautiful Divisors(数学,二进制)
Description Recently Luba learned about a special kind of numbers that she calls beautiful numbers. ...
- 【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]的时 ...
- [CF]Codeforces Round #528 Div.2
Div.2还是稳定四题啊,E题还是没得办法,就争取四题再快点吧. A(签到) 题意:写下s的第一个字符,在最右边写下s的第二个字符,在最左边写下s的第三个字符,以此类推生成字符串t,给出t,求s 找规 ...
- Codeforces 658D Bear and Polynomials【数学】
题目链接: http://codeforces.com/contest/658/problem/D 题意: 给定合法多项式,改变一项的系数,使得P(2)=0,问有多少种方法? 分析: 暴力求和然后依次 ...
- 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× ...
- Codeforces 963A Alternating Sum 【数论+数学】
官方题解这个样子我觉得说得比较清楚.Z我们可以朴素的预处理出来(注意乘法膜),q的话考点在于[分数取膜]即 (a/b)%P = a* inverse of b %P 这就涉及到算b的逆元,我用的是欧几 ...
- 【CodeForces - 124C】Prime Permutation(数学,思维,小结论)
题干: You are given a string s, consisting of small Latin letters. Let's denote the length of the stri ...
- 【CodeForces - 518D】Ilya and Escalator(概率dp,数学期望)
题干: Ilya got tired of sports programming, left university and got a job in the subway. He was given ...
最新文章
- “榕树下·那年”移动app ( hybrid ) 开发总结
- linux系统结构,文件寻址,文件管理编辑,正则表达式
- 信号与系统奥本海姆第二版_【中山大学电通信通信号与系统考研】自编的两张小卡片带大家整理一下《奥本海姆·信号与系统》的知识架构...
- java生日快乐_Java八岁生日快乐!
- 免费的编程中文书籍索引(2018第三版)
- 新鲜出炉--Struct2、Hibernate3、Spring3框架搭建实战
- VC++调试方法和技巧
- eclipse 中使用字符流复制文件乱码解决
- Android中实现微信分享的功能
- OpenBSD身份验证绕过和权限提升漏洞
- 2022前端秋招面试题总结 阿里 腾讯 字节 百度 网易 京东 小红书 快手面试记录
- 激光雷达错位拼接技术
- 计组(七)存储系统:芯片地址
- 系统可打开最大文件数过小,导致CHECK_NRPE: Error - Could not complete SSL handshake
- Android加载图片导致内存溢出(Out of Memory异常)
- nRF52832 定时器REPEATED模式,导致异常重启的问题排查全过程
- 爬楼梯/青蛙跳台阶,不会还有人不会吧
- ejwt积分_菜鸡速通微积分:从十进制展开到数列、级数、幂级数、函数项级数...
- Jmeter多线程并发和压测结果分析
- 痞子衡嵌入式:MCUBootUtility v2.0来袭,i.MXRT1010哪里跑