注意到十进制数的构成是形如,由于高位带了权重,所以一定可以被5整除,只需要看个位数。

个位数有 种取值范围,其对应的模5余数只在0~4,其中0没有贡献不计

当最后一位取值为x时,我们也无需关心他拼在一起是怎么样的,只需要关心这个数字的个位数,

也就是每个数都可以有(n-1)!个方案数,其贡献是x取模于5。

对于实现上,完全可以直接计算出这个倍数,每+10,贡献就多20,10以内的单独算就好了,时间复杂度

#include <iostream>
using namespace std;
const int M=1e9+7;
const int N=2e5+7;
typedef long long ll;
ll ans=1;
ll pre[11];
int main(){
    int n;
    cin>>n;

    for(int i=1;i<n;i++)ans=(ans*i)%M;
    pre[1]=1;
    for(int i=2;i<=10;i++){
        pre[i]=i%5;
        pre[i]+=pre[i-1];
    }
    ll bs=1;
    bs=(bs * pre[n%10])%M;
    if(n>=10){
        bs=(bs + (n/10) * 20)%M;
    }
    ans=(ans * bs)%M;
    cout<<ans;
}