贪心
发现n!的约数也就几万个,然后就可以贪心,每次找最大的减,一定能减完。
证明:我不会
官方题解:http://vfleaking.blog.uoj.ac/blog/219
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int prime[9]={0,2,3,5,7,11,13,17,19}, cnt[9], ncnt;
ll num[50000];
void dfs(int now, ll x)
{
if(now>8)
{
num[++ncnt]=x;
return;
}
dfs(now+1,x);
for(int i = 1; i <= cnt[now]; i++)
{
x*=prime[now];
dfs(now+1,x);
}
}
int main()
{
int n; ll m;
scanf("%d%lld",&n,&m);
for(int i = 1; i <= n; i++)
{
int temp = i;
for(int j = 1; temp != 1; j++)
{
while(temp%prime[j] == 0)
{
temp /= prime[j];
cnt[j]++;
}
}
}
dfs(1,1);
sort(num+1,num+1+ncnt);
while(m)
{
int l = 1, r = ncnt;
while(l<r)
{
int mid = (l+r+1)>>1;
if(num[mid]<=m)l=mid;
else r=mid-1;
}
m-=num[l];
printf("%lld\n",num[l]);
}
}