C. Factorials and Powers of Two
难度:1500
暴力枚举二进制的方法。任何一个数都可以由二进制表示出来,暴力枚举出需要最少的阶乘和二进制数。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
const int inf=0x3f3f3f3f;
int a[N],n,k,idx;
int get(int n)
{
int ans=0;
while(n)
{
if(n&1) ans++;
n>>=1;
}
return ans;
}
void init()
{
a[idx++]=1;
for(int i=1;i<=15;i++)
{
a[idx++]=i*a[i-1];;
}
}
signed main()
{
init();
int t;cin>>t;
while(t--)
{
cin>>n;
k=inf;
for(int i=0;i<(1<<15);i++)
{
int m=n,cnt=0;
for(int j=0;j<15;j++)
{
if((i>>j)&1)
{
m-=a[j];cnt++;
}
}
if(m>=0)
k=min(k,cnt+get(m));
}
cout<<k<<endl;
}
return 0;
}