zoukankan      html  css  js  c++  java
  • 洛谷 P4127 [AHOI2009]同类分布 解题报告

    P4127 [AHOI2009]同类分布

    题目描述

    给出两个数(a,b),求出([a,b])中各位数字之和能整除原数的数的个数。


    说明

    对于所有的数据,(1 ≤ a ≤ b ≤ 10^{18})


    数位dp

    枚举被mod的数,(dp_{i,j,k})表示前(i)位和为(j)模后为(k)的数的个数

    记忆化时随便转移一下就行了


    Code:

    #include <cstdio>
    #include <cstring>
    #define ll long long
    ll po[20],dp[19][170][170],bit[20],p;
    ll dfs(int pos,int sum,int res,int limit)
    {
    	if(!pos) return res==0&&sum==0;
    	if(!limit&&~dp[pos][sum][res]) return dp[pos][sum][res];
    	ll ret=0;
        for(int i=0,up=limit?bit[pos]:9;sum>=i&&i<=up;i++)
        	ret+=dfs(pos-1,sum-i,(res-po[pos-1]*i%p+p)%p,i==up&&limit);
        if(!limit) dp[pos][sum][res]=ret;
        return ret;
    }
    ll cal(ll x)
    {
    	if(!x) return 0;
    	int len=0;ll ans=0;
    	while(x) bit[++len]=x%10,x/=10;
    	for(p=1;p<=len*9;p++)
    	{
    	    memset(dp,-1,sizeof dp);
    	    ans+=dfs(len,p,0,1);
    	}
        return ans;
    }
    int main()
    {
    	ll a,b;
    	scanf("%lld%lld",&a,&b);
    	po[0]=1;
    	for(int i=1;i<=18;i++) po[i]=po[i-1]*10;
    	printf("%lld
    ",cal(b)-cal(a-1));
    	return 0;
    }
    

    2019.2.9

  • 相关阅读:
    第六章 条件处理
    VS2019配置MKL教程(Windows)
    攻防世界--srm-50
    攻防世界--The_Maya_Society
    攻防世界--re1-100
    BUUCTF--findit
    凯撒加密与解密实现
    BUUCTF--rsa
    正则表达式
    PyQuery详解
  • 原文地址:https://www.cnblogs.com/butterflydew/p/10357245.html
Copyright © 2011-2022 走看看