POJ 1777 mason素数
题目大意:
给定数列 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素数的更多相关文章
- POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]
传送门:http://poj.org/problem?id=1845 大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有 ...
- POJ 1811 大素数判断
数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #inc ...
- poj 2262【素数表的应用---判断素数】【哈希】
Goldbach's Conjecture Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35214 Accepted: ...
- poj 2689 巧妙地运用素数筛选
称号: 给出一个区间[L,R]求在该区间内的素数最短,最长距离. (R < 2 * 10^9 , R - L <= 10 ^ 6) 由数论知识可得一个数的因子可在开根号内得到. 所以,我们 ...
- POJ - 3126 bfs + 素数筛法 [kuangbin带你飞]专题一
题意:给定两个四位素数作为终点和起点,每次可以改变起点数的某一位,且改变后的数仍然是素数,问是否可能变换成终点数字? 思路:bfs搜索,每次改变四位数中的某一位.素数打表方便判断新生成的数是否是素数. ...
- poj 1811 随机素数和大数分解(模板)
Sample Input 2 5 10 Sample Output Prime 2 模板学习: 判断是否是素数,数据很大,所以用miller,不是的话再用pollard rho分解 miller : ...
- poj 2689 (素数二次筛选)
Sample Input 2 17 14 17 Sample Output 2,3 are closest, 7,11 are most distant. There are no adjacent ...
- poj 2992 Divisors (素数打表+阶乘因子求解)
Divisors Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9617 Accepted: 2821 Descript ...
- POJ 1777
一道好题. 由算术基本定理,知: 那么,对于上式的每个因子值只能是2^M的形式.取第一个式子为例,通过分解因式出(1+p^2)=2^k知,a只能为1. 于是对于p只能是梅森素数.而且每个梅森素数只能出 ...
随机推荐
- D3.js 饼状图的制作
1.数据 有如下数据,需要可视化: var dataset = [ 30 , 10 , 43 , 55 , 13 ]; 这样的值是不能直接绘图的.例如绘制饼状图的一个部分,需要知道一段弧的起始角度和终 ...
- Linux 下没有 my.cnf 文件的解决方式,完全是我自己整的,好多教程都是瞎扯的 (zhuan)
http://blog.csdn.net/jspping/article/details/40400691?utm_source=tuicool&utm_medium=referral *** ...
- python和shell变量互相传递的几种方法
python -> shell: 1.环境变量 复制代码代码如下: import os var=123或var='123'os.environ['var']=str(var) #enviro ...
- libCEF总结02字符串
libCEF 的 CefString.cef_string_t 在 Windows 下均表示一个 16 位的 Unicode 字符串,它们的使用请参考下面的代码 {//wchar_t* ==> ...
- 腾讯云从零部署nodejs站点
版权声明:本文由袁飞翔原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/176 来源:腾云阁 https://www.qclo ...
- unity3d WorldComposer1 卫星地图生成地形
http://blog.csdn.net/myarrow/article/details/42709113 1. 简介 1.1 TerrainComposer(TC) 一个Unity扩展工具,可用于创 ...
- 使用Objective-C的文档生成工具
前言 做项目的人多了,就需要文档了.今天开始尝试写一些项目文档.但是就源代码来说,文档最好和源码在一起,这样更新起来更加方便和顺手.象Java语言本身就自带javadoc命令,可以从源码中抽取文档.今 ...
- container 的背后
如果要看laravel的单个功能的源代码,首先去找对应得ServiceProvider,例如加密功能hash,则按一下步骤查看源代码: HashServiceProvider.php(主要是看regi ...
- ASP.NET页面与IIS底层交互和工作原理详解
转载自:http://www.cnblogs.com/lidabo/archive/2012/03/13/2393200.html 第一回: 引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是 ...
- backbone--部分总结
1.Backbone.history.start 方法可以让我们在点击后退或者前进的时候同样会触发路由的事件. 2.添加路由的路径,添加的路由路径要求重写父类的routes这个对象 var CustR ...