注意到十进制数的构成是形如,由于高位带了权重,所以一定可以被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;
}

京公网安备 11010502036488号