借鉴:https://blog.csdn.net/miku23736748/article/details/52135932

https://blog.csdn.net/acm_cxlove/article/details/7860735

题意:给定k个数,然后为每个数添加一个幂ei(0=<ei<=10),最后k项累乘的结果为M,如果M的所有因子的和可以写成2^x,求x的最大值,如果没有条件满足,输出NO

我们把满足 E = 2 ^ i - 1 的数称为梅林数  E如果是素数则为梅森素数。

关于梅森素数,有一个重要的定理:“一个数能够写成几个不重复的梅森素数的乘积” 等价于 “这个数的约数和是2的幂次”,但是不能重复,比如说3是梅森素数,9就不满足约数和为2的幂次。 因为9 = 3 * 3   3重复了 所以9就不是2的幂次

并且这个2的幂(指数)正好等于作为因子的梅森素数的梅森指数的和。

而  3 (2的2次幂-1) X 7 (2的3次幂-1) = 21;

21的因数和1+3+7+21=32=2^5;  这个  2的幂 5 = 2 + 3;

所以本题的解题思路就出来了

对于每一个输入的数  我们去判断是否为几个不重复的梅林素数的乘积组成的

如果不是则把这个数的e置为0  所以就不用考虑它了

如果是 我们就用二进制去记下它是由那几个梅林素数组成的  这里我们记下的是梅林素数在数组中的下标  也是对应梅林素数的梅林指数在相应数组中的下标 因为都一一对应

然后我们遍历这些这些下标。。。用dp数组标记这些下标  和  可以由这些下标组成的另一些下标 而且这另一些下标还得必须是输入的那几个数所产生的

这句话什么意思呢。。。就是看看组成输入的这几个数的梅林素数是否有重复  没有就合并

最后通过标记 累加梅林素数的梅林指数 求出最大值即可

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 0x7fffffff;
int mason[]={,,,,,,,}; //梅林素数
int ans[]={,,,,,,,}; //梅林素数对应的梅林指数
int dp[<<]; int check(int k)
{
int cnt = ;
for(int i=; i<; i++)
{
if(k % mason[i] == )
{
cnt |= <<i;
k /= mason[i];
}
if(k % mason[i] == )
{
return ;
}
}
if(k > )
return ;
return cnt;
} int cal(int x)
{
int res = ;
for(int i=; i<; i++)
if(x & (<<i))
res += ans[i];
return res;
} int main()
{
int n, a[];
while(~scanf("%d",&n))
{
mem(a, );
mem(dp, );
for(int i=; i<n; i++)
{
int w;
scanf("%d",&w);
int temp = check(w);
if(!temp) i--, n--;
else a[i] = temp;
}
if(n == )
{
cout<< "NO" <<endl;
continue;
}
dp[] = ;
for(int i=; i<n; i++)
for(int j=; j< <<; j++)
if(!(j & a[i])) //判断两个数的梅林素数是否重复
dp[j|a[i]] |= dp[j];  //j|a[i] 第一次是否被标记却决于dp[j] 因为a[i]肯定有 但不知道j是否有 这样想 = 就可以 但为什么是 |= ,以为如果另一对j|a[i]的值与这对相同 而这对的j存在 另一对的j不存在 如果是=就会被置为零 所以用|=
int maxx = -INF;
for(int i=; i< <<; i++)
{
if(dp[i])
maxx = max(maxx, cal(i)); }
cout<< maxx <<endl; } return ;
}

Vivian's Problem UVA - 1323(梅林素数+状压二进制)的更多相关文章

  1. ACM学习历程—ZOJ 3777 Problem Arrangement(递推 && 状压)

    Description The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem sett ...

  2. UVa 1204 Fun Game (状压DP)

    题意:有一些小孩(至少两个)围成一圈,有 n 轮游戏,每一轮从某个小孩开始往左或者往右伟手帕,拿到手帕写上自己的性别(B,G),然后以后相同方向给下一个. 然后在某个小孩结束,给出 n 轮手帕上的序列 ...

  3. UVa 11825 Hackers' Crackdown (状压DP)

    题意:给定 n 个计算机的一个关系图,你可以停止每台计算机的一项服务,并且和该计算机相邻的计算机也会终止,问你最多能终止多少服务. 析:这个题意思就是说把 n 台计算机尽可能多的分成一些组,使得每组的 ...

  4. ZOJ Problem Set - 2297 Survival 【状压dp】

    题目:ZOJ Problem Set - 2297 Survival 题意:给出一些怪,有两个值,打他花费的血和能够添加的血,然后有一个boss,必须把小怪全部都打死之后才干打boss,血量小于0会死 ...

  5. ACM学习历程—ZOJ3777 Problem Arrangement(递推 && 状压)

    Description The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem sett ...

  6. UVA 11600-Masud Rana(状压,概率dp)

    题意: 有n个节点的图,开始有一些边存在,现在每天任意选择两点连一条边(可能已经连过),求使整个图联通的期望天数. 分析: 由于开始图可以看做几个连通分量,想到了以前做的一个题,一个点代表一个集合(这 ...

  7. UVa 1252 Twenty Questions (状压DP+记忆化搜索)

    题意:有n件物品,每件物品有m个特征,可以对特征进行询问,询问的结果是得知某个物体是否含有该特征,要把所有的物品区分出来(n个物品的特征都互不相同), 最小需要多少次询问? 析:我们假设心中想的那个物 ...

  8. HDU - 6321 Problem C. Dynamic Graph Matching (状压dp)

    题意:给定一个N个点的零图,M次操作,添加或删除一条边,每一次操作以后,打印用1,2,...N/2条边构成的匹配数. 分析:因为N的范围很小,所以可以把点的枚举状态用二进制表示集合.用一维数组dp[S ...

  9. UVA - 1252 Twenty Questions (状压dp+vis数组加速)

    有n个物品,每个物品有m个特征.随机选择一个物品让你去猜,你每次可以询问一个特征的答案,问在采取最优策略时,最坏情况下需要猜的次数是多少. 设siz[S]为满足特征性质集合S的特征的物品总数,dp[S ...

随机推荐

  1. SSL详解

    SSL 1.整体结构 SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下 SSL:(Secure Socket Layer,安全套接字层),为Netscape所研发,用以保障在Int ...

  2. NAT概念解释(不完全版,但不会搞错...)

    NAT在计算器网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading)是一种IP数据包在通过路由器或防 ...

  3. js数组知识点总结及经典笔试题

    1.判断数组 这是笔试里经常会出现的知识考察点,总结一下 (1)Array.isArray()方法判断 var a=[]; Array.isArray(a) //返回true var b='hello ...

  4. MapReduce任务学习系列

    首先放一张官方图片,大致了解下整个MapReduce的处理过程. 抛出如下疑问: 1.MapReduce的基本原理是什么?即利用什么机制来实现的任务拆分处理? 2.MapReduce任务执行过程是什么 ...

  5. Streamr助你掌控自己的数据(3)——教你在Streamr市场上发布数据

    博客说明 所有刊发内容均可转载但是需要注明出处. 教你在Streamr市场上发布数据 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...

  6. 论文笔记:分形网络(FractalNet: Ultra-Deep Neural Networks without Residuals)

    FractalNet: Ultra-Deep Neural Networks without Residuals ICLR 2017 Gustav Larsson, Michael Maire, Gr ...

  7. 《The Mythical Man-Month(人月神话)》读后感(2)

    第10章 未雨绸缪 在化学领域中,在实验室可以进行的反应过程,并不能在工厂中一步实现.一个被称为“ 实验性工厂(pilot planet)”的中间步骤是非常必要的,它会为提高产量和在缺乏保护的环境下运 ...

  8. 实验二 Java面向对象程序化设计

    实验二 Java面向对象程序设计 一.  实验要求 1.完成实验.撰写实验报告,以博客方式发表在博客园 2.实验报告重点是运行结果.遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办 ...

  9. 团队计划backlog---DayTwo

    任务索引卡(Two): 1.  季方:实现界面跳转,数据库相关数据的显示 的测试: 2.  司宇航:添加部分团队博客,并测试: 3.  王金萱.马佳慧:学习爬虫的相关内容,为将来统计博客部分做准备: ...

  10. 如何获取启动页activity

    启动页activity指App启动的第一个activity,介绍几种查看启动页activity的方法: 方法一:问开发,最有效的获取方式 方法二:dumpsys package 包名,前提是知道包名( ...