题意:
找有几个n位数,他的后缀(包括自身)可以被k整除。答案对m取模
POINT:
数位DP,dp[x][y][z]记录 当前x位数对k取模等于y,z代表有没有后缀已经被k整除了。 即y==0。
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
const LL maxn = 1234 + 10;
const int inf = 0x3f3f3f3f;
int shi[1234];
int dp[1111][111][2];
int n,k,m;
int dfs(int now,int mod,bool flag)
{
if(dp[now][mod][flag]!=-1) return dp[now][mod][flag];
if(now==n+1) return flag;
int limit=now==n?1:0;
int ans=0;
for(int i=limit;i<=9;i++){
ans+=dfs(now+1,(mod+shi[now-1]*i)%k,flag||(i>0&&(mod+shi[now-1]*i)%k==0));
ans=ans%m;
}
return dp[now][mod][flag]=ans;
}
int main()
{
memset(dp,-1,sizeof dp);
scanf("%d%d%d",&n,&k,&m);
shi[0]=1;
for(int i=1;i<=1000;i++){
shi[i]=shi[i-1]*10%k;
}
printf("%d\n",dfs(1,0,false)%m);
}

本文介绍了一个使用数位动态规划(数位DP)解决特定数学问题的方法。该问题要求找出有多少个n位正整数,使得这些数的后缀(包括自身)能被k整除,并给出答案对m取模的结果。通过构建状态转移方程,文章提供了一种高效的求解策略。
;
1338

被折叠的 条评论
为什么被折叠?



