Description
从
1
~
Input
一个整数
Output
输出满足条件的方案数,结果模 109+7
Sample Input
7
Sample Output
0
Solution
数位
DP
找到不超过
m
的数里恰有
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100001;
#define mod 1000000007
int m,n,a[15],dp[15][15],cnt[15],ans;
int dfs(int pos,int num,int fp)
{
if(pos<0)return num==0;
if(!fp&&~dp[pos][num])return dp[pos][num];
int ans=0,fpmax=fp?a[pos]:9;
for(int i=0;i<=fpmax;i++)
ans+=dfs(pos-1,num-(i==4||i==7),fp&&i==fpmax);
if(!fp)dp[pos][num]=ans;
return ans;
}
void dfs1(int num,int now,int res,int tans)
{
if(now>=num)return ;
if(res==6)
{
ans+=tans;
if(ans>=mod)ans-=mod;
return ;
}
for(int i=0;i<=n;i++)
if(cnt[i])
{
cnt[i]--;
dfs1(num,now+i,res+1,(ll)tans*(cnt[i]+1)%mod);
cnt[i]++;
}
}
int main()
{
scanf("%d",&m);
n=0;
while(m)a[n++]=m%10,m/=10;
memset(dp,-1,sizeof(dp));
for(int i=0;i<=n;i++)cnt[i]=dfs(n-1,i,1);
//printf("cnt[%d]=%d\n",i,cnt[i]);
cnt[0]--;
ans=0;
for(int i=1;i<=n;i++)dfs1(i,0,0,cnt[i]);
printf("%d\n",ans);
return 0;
}