题目大意:

给定数列 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. java技术知识点

    1   自我介绍 2  做过的项目 (Java 基础) 3  Java的四个基本特性(抽象.封装.继承,多态),对多态的理解(多态的实现方式)以及在项目中那些地方用到多态 Java的四个基本特性 ◦  ...

  2. overflow:auto/hidden的应用

    一.自适应两栏布局 <!DOCTYPE html><html lang="zh-CN"><head> <meta charset=&quo ...

  3. js 一些技巧

    转自 http://blog.csdn.net/lin49940/article/details/1703533 1. oncontextmenu="window.event.returnV ...

  4. 串行通讯之UARTLoopback

    目录 第1章串行通讯之UARTLoopback    2 1 USB转串口    2 2 USB Accessory    2 3 连入手机    3 4 代码改进    4 5 打开串口    4 ...

  5. 关于MySQL回滚机制

    在事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作,此时事务会将之前的操作进行回滚.回滚的意思是如果之前是插入操作,那么会执行删 除插入的记录,如果之前是update操作,也会执行up ...

  6. php 变量原理

    1.php作为一种弱类型语言,不需要显式的指明变量的类型,但是php变量也是有类型的,php变量包含以下8种变量(三大类) a.标量类型:boolean,integer,float(double),s ...

  7. Servlet复习1: 一个简单的Servlet的使用

    Servlet学习 1. Servlet与JSP的关系 2. Servlet的声明周期 3. 一个简单的Servlet的使用方法 什么是Servlet? 什么又是JSP? 继承了javax.servl ...

  8. hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  9. java多线程下如何调用一个共同的内存单元(调用同一个对象)

    /* * 关于线程下共享相同的内存单元(包括代码与数据) * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作. * 对于Thread(Runnable target)构造方法创建的线程, ...

  10. CSS水平居中和垂直居中解决方案

    一.CSS 居中 — 水平居中 DIV等标签本身没有定义自己居中的属性,网上很多的方法都是介绍用上级的text-align: center,然后嵌套一层DIV来解决问题. 可是这个方法有时候完全不起作 ...