1. 程式人生 > >【搜尋】WAR大佬的SET @upcexam6201

【搜尋】WAR大佬的SET @upcexam6201

時間限制: 1 Sec 記憶體限制: 128 MB
題目描述
WAR大佬認為一個包含重複元素的集合認為是優美的,當且僅當集合中的元素的和等於他們的積。
求包含n個元素的優美的集合的個數。
WAR大佬當然會啊,他只是想考考你。
輸入
一個正整數n(2<=n<=1000)
輸出
一個數ans表示集合的個數
樣例輸入
5
樣例輸出
3
提示
1+1+1+2+5=1*1*1*2*5
1+1+1+3+3=1*1*1*3*3
1+1+2+2+2=1*1*2*2*2

dfs,注意題目說了必須要有重複元素
剪枝條件是後面每位都用當前數且exmul*冪大於exsum+和時

#define FILE() freopen("../../in.txt","r",stdin)
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 1005;

ll fstpow(ll a,ll n) {
    ll res = 1;
    while(n) {
        if(n&1)res*=a;
        a*=a;
        n>>=1;
    }
    return res;
}

ll dfs(ll _digit,ll _num,ll _exmul,ll _exsum) {
    _exmul*=_num;
    _exsum+=_num;
    if
(_digit==1) { if(_exmul==_exsum)return 1; else return 0; } ll ans = 0; for(ll i=_num;; i++) { if(_exmul*fstpow(i,_digit-1)>_exsum+i*(_digit-1))break; if(_digit==2&&_num==1)break; ans+=dfs(_digit-1,i,_exmul,_exsum); } return ans; } int
main() { // FILE(); // freopen("../../out.txt","w",stdout); ll n; scanf("%lld",&n); if(n==2||n==3)printf("0\n"); else { ll ans = 0; ll digit = min(n,32ll); ans=dfs(digit,1,1,n-digit); printf("%lld\n",ans); } return 0; }