题目大意:

给定数列 a1 , a2 , ... , an

希望找到一个  N = sigma(ai^ki)  , (0<=ki<10) ,ki可随自己定为什么

只要保证N的因子和可以表示为 2^t的形式 , 输出t , 找不到就输出 NO

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

还有一个重要内容就是,N的约数和幂次是可以直接由构成它的梅森素数的来源幂次相加而得的。

“一个数能够写成几个不重复的梅森素数的乘积” 等价于 “这个数的约数和是2的幂次” 因为这两个概念是充分必要的

那么就说明在这里要找到一个N表示为几个梅森素数的乘积,那么很明显,这里的ki只能是 0或者1 , 因为只要乘方了,那么必然那个数要么无法用梅森素数的乘积表示

要么乘积中存在重复的梅森素数

这里数字小于 2^31 , 在这个范围内只有 8个梅森素数

一个个枚举跑一遍就行了,最后结合得到答案,可以利用简单的dp背包的思想

 #include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <iostream>
#include <set>
using namespace std;
#define pii pair<int,int>
const int p[] = {,,,,,,,}; //mason数的p的位置,表示为2^p-1
int mason[] , len[(<<)] , rec[(<<)] , tot;
bool vis[(<<)];
set<int> st; int Mason(int b){return (<<b)-;} void get_mason(){for(int i= ; i< ; i++)mason[i] = Mason(p[i]);} void init()
{
int all = (<<);
for(int i= ; i<all ; i++){
int t = ;
for(int j= ; j< ; j++)
if(i&(<<j)) t+=p[j];
len[i] = t;
}
} int ok(int x)
{
int cur = ;
for(int i= ; i< ; i++){
if(x%mason[i]==){
x /= mason[i];
cur|=(<<i);
}
}
if(x>) cur = ;
return cur;
} int main()
{
// freopen("a.in" , "r" , stdin);
get_mason();
init();
int n , a;
while(~scanf("%d" , &n)){
st.clear();
for(int i= ; i<n ; i++){
scanf("%d" , &a);
int state = ok(a);
if(state) st.insert(state);
} memset(vis , , sizeof(vis));
tot = ;
set<int>::iterator it=st.begin();
for( ; it!=st.end() ; it++) rec[tot++] = *it;
int all = (<<);
vis[] = true;
for(int i= ; i<tot ; i++){
for(int j=all- ; j>=rec[i] ; j--)
if((rec[i]&j) == rec[i]) vis[j] = vis[j-rec[i]] | vis[j];
}
int ret = ;
for(int j= ; j<all ; j++)
if(vis[j]) ret = max(ret , len[j]);
if(ret) printf("%d\n" , ret);
else puts("NO");
}
return ;
}

POJ 1777 mason素数的更多相关文章

  1. POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    传送门:http://poj.org/problem?id=1845 大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有 ...

  2. POJ 1811 大素数判断

    数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #inc ...

  3. poj 2262【素数表的应用---判断素数】【哈希】

    Goldbach's Conjecture Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 35214   Accepted: ...

  4. poj 2689 巧妙地运用素数筛选

    称号: 给出一个区间[L,R]求在该区间内的素数最短,最长距离. (R < 2 * 10^9 , R - L <= 10 ^ 6) 由数论知识可得一个数的因子可在开根号内得到. 所以,我们 ...

  5. POJ - 3126 bfs + 素数筛法 [kuangbin带你飞]专题一

    题意:给定两个四位素数作为终点和起点,每次可以改变起点数的某一位,且改变后的数仍然是素数,问是否可能变换成终点数字? 思路:bfs搜索,每次改变四位数中的某一位.素数打表方便判断新生成的数是否是素数. ...

  6. poj 1811 随机素数和大数分解(模板)

    Sample Input 2 5 10 Sample Output Prime 2 模板学习: 判断是否是素数,数据很大,所以用miller,不是的话再用pollard rho分解 miller : ...

  7. poj 2689 (素数二次筛选)

    Sample Input 2 17 14 17 Sample Output 2,3 are closest, 7,11 are most distant. There are no adjacent ...

  8. poj 2992 Divisors (素数打表+阶乘因子求解)

    Divisors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9617   Accepted: 2821 Descript ...

  9. POJ 1777

    一道好题. 由算术基本定理,知: 那么,对于上式的每个因子值只能是2^M的形式.取第一个式子为例,通过分解因式出(1+p^2)=2^k知,a只能为1. 于是对于p只能是梅森素数.而且每个梅森素数只能出 ...

随机推荐

  1. web前端学习(一) html+js实现文本框背景及只读属性修改

    因为工作需求接触了html+javascript,对于从事嵌入式开发,一直接触c和汇编的我,感觉这种语言是一个的全新的领域,宽松的语法要求,等同于文本逻辑的输出,当然我并不认为它简单,错误检查的缺少让 ...

  2. D3.js 选择元素和绑定数据/使用数据

    选择元素和绑定数据是 D3 最基础的内容,本文将对其进行一个简单的介绍. 一.如何选择元素 在 D3 中,用于选择元素的函数有两个: d3.select():是选择所有指定元素的第一个 d3.sele ...

  3. Mvc4_MvcPager 概述

    MvcPager分页控件是在ASP.NET MVC Web应用程序中实现分页功能的一系列扩展方法,该分页控件的最初的实现方法借鉴了网上流行的部分源代码, 尤其是ScottGu的PagedList< ...

  4. 转!!Java 基础面试题的剖析: short s1=1;s1 = s1 +1 报错? s1+=1 呢

    short s1=1;s1 = s1 +1会报错吗?    package common; public class ShortTypeTest { /* * @param args */ publi ...

  5. hiho_1079_离散化

    题目 在长度为L的宣传栏上张贴N张海报,将宣传栏分为L个长度为1的单位,海报长度为整数,且高度和宣传栏相同,左右边界和宣传栏单位之间缝隙重合(即海报总是跨越整数个单位).后贴的海报可能会覆盖之前贴的海 ...

  6. Ajax中eval的使用详解

    定义和用法 Eval它是用来计算某个字符串,并且执行其中的JavaScript代码. 语法 1) eval函数接受一个string这个参数,并且这个参数是必须的,这个参数就是要计算的这个字符串.它里面 ...

  7. 测序深度和覆盖度(Sequencing depth and coverage)

    总是跑数据,却对数据一无所知,这说不过去吧. 看几篇文章吧 Sequencing depth and coverage: key considerations in genomic analyses( ...

  8. PacBio下机数据解读

    今天被人问起如何看懂三代的下机数据,虽然解决了别人的问题,但感觉自己还是没有搞透. 基本的目录结构: |-- HG002new_O1l_BP_P6_021315b_MB_100pM | |-- D01 ...

  9. robotframework笔记5

    循环条件 *** Settings *** Library BuiltIn Library Collections *** Test Cases *** TestCase01 My Keyword 0 ...

  10. 网络与RPC

    网络与RPC 标签 : Java基础 Java为网络编程提供的java.net包封装了底层通信细节, 包含了大量的基础组件以及TCP/UDP协议的编程接口, 使得开发者可以专注于解决问题, 而不用关注 ...