这题很 cf 。虽然 n 很大,但由于
前面的 1到
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
typedef long long LL;
LL n,K,ans,a[25],m,fac[25],f[25][2][2];
int b[20];
bool vis[25];
LL Calc(LL n){
LL res=0;
b[0]=0; do b[++b[0]]=n%10, n/=10; while(n);
f[b[0]+1][0][0]=1;
for(int i=b[0]+1;i>=2;i--)
for(int j1=0;j1<=1;j1++)
for(int j2=0;j2<=1;j2++) if(f[i][j1][j2])
for(int k=(j2?1:0);k<=(j1?9:b[i-1]);k++) if(k==0||k==4||k==7)
f[i-1][j1|(k<b[i-1])][j2|(k>0)]+=f[i][j1][j2];
return f[1][0][1]+f[1][1][1];
}
bool check(int n){
do{
if(n%10!=4&&n%10!=7) return false;
n/=10;
}while(n);
return true;
}
int main(){
freopen("cf121C.in","r",stdin);
freopen("cf121C.out","w",stdout);
fac[0]=1; for(int i=1;i<=20;i++) fac[i]=fac[i-1]*i;
scanf("%d%d",&n,&K); m=max(0LL,n-15);
if(n<=15&&fac[n]<K) return printf("-1"),0;
ans=Calc(m);
for(int i=m+1;i<=n;i++){
int now=1; while(K>fac[n-i]) K-=fac[n-i], now++;
for(int j=1;j<=n-m;j++) if(!vis[j]) if(!(--now)){ a[i-m]=j; vis[j]=true; break; }
if(check(i)&&check(m+a[i-m])) ans++;
}
printf("%I64d\n",ans);
return 0;
}