先写了一个45分的dfs
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
LL n,m,ans[50],P=1;
void dfs(int x,LL sum)
{
if(x==n+1)
{
if(sum==m){
for(int i=1;i<x;i++) printf("%lld
",ans[i]);
exit(0);
}
return;
}
if(sum==m){
for(int i=1;i<x;i++) printf("%lld
",ans[i]);
exit(0);
}
for(LL i=m-sum;i>=ans[x-1];i--)
{
if(P%i==0) ans[x]=i,dfs(x+1,sum+i);
}
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=2;i<=n;i++) P*=1ll*i;
ans[0]=1;
dfs(1,0);
return 0;
}
好像有贪心的写法
http://uoj.ac/submission/12608参考
阶乘进位制?
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
LL n,m,tot=1;
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) tot*=1ll*i;
for(int i=1;i<=n;i++)
{
tot/=i;
if(tot<=m)
{
printf("%lld
",tot*(m/tot));
m%=tot;
}
}
return 0;
}