zoukankan      html  css  js  c++  java
  • CF507D The Maths Lecture【数位dp】

    题目链接

    题目解析

    还是数位(dp),不过是从后往前(dp),方便算后缀。

    然后它是是否存在一个后缀,我们(dp)到前面的时候不知道前面有没有,所以还要再加一维状态表示是否已经存在一个能整除的后缀。

    注意细节,比如那个模数。


    ►Code View

    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    using namespace std;
    #define N 1005
    #define K 105
    #define INF 0x3f3f3f3f3f3f3f3f
    #define LL long long
    LL rd()
    {
    	LL x=0,f=1;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
    	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48); c=getchar();}
    	return f*x;
    }
    LL MOD;
    int n,k;
    LL f[N][K][2];//是否已经含有能整除的后缀 
    LL pw[N];
    LL dfs(int p,int m,bool s)
    {
    	if(p==0) return (s==1);
    	if(f[p][m][s]!=-1) return f[p][m][s];
    	LL res=0;
    	int st=0;
    	if(p==1) st=1;
    	for(int i=st;i<=9;i++)
    	{
    		int tmp=(m+i*pw[n-p])%k;
    		res=(res+dfs(p-1,tmp,s||(tmp==0&&(m||i))))%MOD;//后缀不能为0
    	}
    	return f[p][m][s]=res;
    }
    int main()
    {
    	n=rd(),k=rd(),MOD=rd();
    	pw[0]=1ll;
    	for(int i=1;i<=n;i++)
    		pw[i]=pw[i-1]*10%k;//不是%MOD 那个是模方案数 我这里是算后缀模k的余数 用来转移 
    	memset(f,-1,sizeof(f));
    	printf("%lld
    ",dfs(n,0,0));
    	return 0;
    }
    
    
  • 相关阅读:
    java的初始化
    java继承
    java多态
    static、final关键字
    java的清理
    java访问权限控制
    java对象与引用及参数传递
    java学习--学生成绩管理系统
    The Nth Item 南昌网络赛(递推数列,分段打表)
    Random Access Iterator 徐州网络赛(树形dp)
  • 原文地址:https://www.cnblogs.com/lyttt/p/14086415.html
Copyright © 2011-2022 走看看