二进制枚举阶乘之和

Posted 鱼竿钓鱼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制枚举阶乘之和相关的知识,希望对你有一定的参考价值。

【二进制枚举】阶乘之和

题目链接

题目

在这里插入图片描述

思路

阶乘增长很快,10!就已经超过1e6了。
原本想背包存在性DP整一波,写了一半发现不用,直接二进制枚举选与不选即可即可。
比较一下01背包和二进制枚举
01 背 包 O ( n m ) 01背包 O(nm) 01O(nm)
二 进 制 枚 举 O ( 2 n ) 二进制枚举 O(2^n) O(2n)
这里n很小,所以二进制枚举更好一些

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=15,M=5e6+10;
LL w[N]={1};
bool exist[M];
LL fac=1,cnt=1;
int main(){
    for(int i=1;i<=10;i++){
        fac*=i;
        w[cnt++]=fac;
    }
    for(int i=0;i<(1<<cnt);i++){
        LL tmp=0;
        for(int j=0;j<cnt;j++){
            if(i&(1<<j))tmp+=w[j];
        }
        if(tmp>0&&tmp<=1e6)exist[tmp]=1;
    }

    LL n;
    while(cin>>n){
        if(n<0)break;
        if(exist[n])puts("YES");
        else puts("NO");
    }
    return 0;
}

以上是关于二进制枚举阶乘之和的主要内容,如果未能解决你的问题,请参考以下文章

计算阶乘之和

解题报告Acwing每日一题 夏季 [1/16]

vb 求阶乘之和

Luogu P1009 阶乘之和

阶乘之和(防止int类型溢出的小技巧&计时函数)

HDU 1197 Specialized Four-Digit Numbers (枚举+进制转化,简单)