把一個數分解成階乘之和。 這個數小於10^18。10^18次方要用longlong來存。這樣的話,0到19的階乘總共是20個數 2^20 次方種狀態,是不能直接算組合的
這時候我還正是卡住了。
這道小水題告訴你的就是,當你不能直接搞的時候,就想想其他的策略,最簡單的就是貪心。
這個題中要是貪心的話肯定是從大往小了找,但是這樣會不會丟失正確答案呢?
因爲是階乘 所以,n!> (n-1)!+(n-2)!+..+0! 指數增長的都是這樣 最熟悉的 2^n=2^n-1+2^n-2+。。。。+2^1+2^0 +1
所以一定要從大的開始取,所以這個題就可以解決了。
#include<stdio.h>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
ll fac[21];
int main()
{
int cas;
fac[0]=1;
for(int i=1;i<20;i++)
fac[i]=fac[i-1]*i;
scanf("%d",&cas);
for(int T=1;T<=cas;T++)
{
ll sum;
scanf("%lld",&sum);
vector<int> ans;
for(int i=19;i>=0;i--)
{
if(sum-fac[i]>=0)
{
ans.push_back(i);
sum-=fac[i];
if(sum==0)
{
break;
}
}
}
printf("Case %d: ",T);
if(sum!=0)
{
printf("impossible\n");
}
else
{
for(int j=ans.size()-1;j>=0;j--)
{
if(j!=0)
printf("%d!+",ans[j]);
else
printf("%d!\n",ans[j]);
}
}
}
return 0;
}請問