zoukankan      html  css  js  c++  java
  • poj 1777梅森素数

    能力太水了,下个月的长春邀请赛可怎么办。。。。唉。。。

    梅森素数(把形如(2p-1)形式的素数称为梅森素数,p是素数),挺好的一道题,

    1.一个正整数n的所有约数和是2的幂<===>n能够被分解为若干个不同的梅森素数之积。

    2.约数和S=(1+p1+p12+…+p1a1 )( 1+p2+p22+…+p2a2)…(1+pk+pk2+…+pkak)

    3.输入p1,p2,…,pn,有非梅森素数或非梅森素数的乘积,去掉

    0

    1

    2

    3

    4

    5

    6

    7

    8

    素数指数pr

    2

    3

    5

    7

    13

    17

    19

    31

    mer 2pr-1

    3

    7

    31

    127

    8191

    131071

    524287

    2147483647

    Hash mer(10)

    1

    2

    4

    8

    16

    32

    64

    128

    Hash mer(2)

    1

    10

    100

    1000

    10000

    100000

    1000000

    10000000

    由于题中给的只有8个数,故任何梅森素数之间的乘积共有28种情况,将状态存在dp[256]中,每个状态保存其约数和的指数。

    例如 93 保存为 (100+1)2=(101)2=5,dp[5]中,

    2*25=26,dp值为6

    4.计算出任意dp可生成新的dp值

    5.从dp中找一个最大的

     1 #include <iostream>
    2 #include <stdio.h>
    3 #include <string.h>
    4 #include <algorithm>
    5 using namespace std;
    6
    7 int pr[9]={0,2,3,5,7,13,17,19,31},mer[9]={0,3,7,31,127,8191,131071,524287,2147483647};
    8 int hashh[9]={0,1,2,4,8,16,32,64,128};
    9 int dp[257],prime[300],m;
    10 bool visit[257];
    11
    12 bool cmp(int a,int b){return a<b;}
    13
    14 void ins()
    15 {
    16 for(int i=1;i<=256;i++)
    17 for(int j=1;j<=8;j++)
    18 if(i&hashh[j])
    19 dp[i]+=pr[j];
    20 }
    21
    22 int check(int p)
    23 {
    24 int ret=0;//在dp中的哪个位置
    25 for(int i=1;i<=8;i++)
    26 {
    27 if(p%mer[i]==0)
    28 {
    29 p/=mer[i];
    30 ret+=hashh[i];
    31 }
    32 if(p%mer[i]==0) return -1;
    33 }
    34 if(p>1) return -1;
    35 else return ret;
    36 }
    37
    38 int DP()
    39 {
    40 memset(visit,0,sizeof(visit));
    41 sort(prime+1,prime+m+1,cmp);
    42 for(int i=1;i<=m;i++)
    43 visit[prime[i]]=1;
    44 for(int i=1;i<=256;i++)
    45 for(int j=1;j<=m;j++)
    46 if(visit[i] && (i & prime[j])==0 && visit[i+prime[j]]==0)//i&prime[i]==0 意为 i 不可能由prime[i]构成
    47 visit[i+prime[j]]=1;
    48 int ans=0;
    49 for(int i=1;i<=256;i++)
    50 if(visit[i] && ans<dp[i]) ans=dp[i];
    51 return ans;
    52 }
    53 int main()
    54 { memset(dp,0,sizeof(dp));
    55 ins();
    56 int k,a,temp;
    57 freopen("in.txt","r",stdin);
    58 while(scanf("%d",&k)!=EOF)
    59 {
    60 m=0;
    61 for(int i=1;i<=k;i++)
    62 {
    63 scanf("%d",&a);
    64 temp=check(a);
    65 if(temp!=-1)
    66 prime[++m]=temp;
    67 }
    68 if(m==0)
    69 {printf("NO\n");continue;}
    70 printf("%d\n",DP());
    71 }
    72 return 0;
    73 }
  • 相关阅读:
    Sublime Text3 支持Less
    Typescript + React-Router + Webpack 实现按需打包/加载
    从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境
    JavaScript中的一些小细节
    微信小程序(safair浏览器)flex布局中的坑
    使用YQL解决让前端爬取网页并解析
    react diff算法剖析总结
    微信小程序IOS系统中,倒计时(setInterval函数)失效的问题
    微信小程序中未解决的坑
    利用nodejs监控文件变化并使用sftp上传到服务器
  • 原文地址:https://www.cnblogs.com/inpeace7/p/2413987.html
Copyright © 2011-2022 走看看