zoukankan      html  css  js  c++  java
  • 【BZOJ1799】[AHOI2009]同类分布(动态规划)

    【BZOJ1799】[AHOI2009]同类分布(动态规划)

    题面

    BZOJ
    洛谷

    题解

    很容易想到数位(dp),然而数字和整除原数似乎不好记录。没关系,直接枚举数字和就好了,这样子就可以把整除原数的余数直接记下来,然后就很好写了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define ll long long
    ll l,r;int w[20];
    ll f[20][200][200][2];
    ll Solve(ll a)
    {
    	if(!a)return 0;ll ret=0;int tot=0;
    	while(a)w[++tot]=a%10,a/=10;
    	reverse(&w[1],&w[tot+1]);
    	for(int p=1;p<=tot*9;++p)
    	{
    		memset(f,0,sizeof(f));f[0][0][0][0]=1;
    		for(int i=1;i<=tot;++i)
    			for(int j=0;j<=p;++j)
    				for(int k=0;k<p;++k)
    					for(int l=0;l<=9;++l)
    					{
    						if(j+l>p)continue;
    						f[i][j+l][(k*10+l)%p][1]+=f[i-1][j][k][1];
    						if(l<w[i])f[i][j+l][(k*10+l)%p][1]+=f[i-1][j][k][0];
    						if(l==w[i])f[i][j+l][(k*10+l)%p][0]+=f[i-1][j][k][0];
    					}
    		ret+=f[tot][p][0][0]+f[tot][p][0][1];
    	}
    	return ret;
    }
    int main()
    {
    	cin>>l>>r;
    	cout<<Solve(r)-Solve(l-1)<<endl;
    	return 0;
    }
    
  • 相关阅读:
    tab切换与表格展示
    ajax
    api
    slice() 方法
    iframe跳转
    快排序
    【问题排查】cpu占用过高排查
    LOJ6013 负载平衡 [最小费用最大流]
    随机序列 [思维题, 组合数]
    P1777 帮助 [状压dp]
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9794133.html
Copyright © 2011-2022 走看看