数位dp

先从1到162枚举各位数之和

s[i][j][k][l]表示i位数,第一位小于等于j,当前各位数字和为k,当前取模余数为l的方案数

然后脑补一下转移就行了

详见代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define ll long long using namespace std;
ll P;
int bin[20];
bool vis[20][180][180];
ll s[20][10][180][180]; ll f(int n,int t,int sum,int mod);
void solve(int n,int sum,int mod){
if (n<1) return;
if (vis[n][sum][mod]) return;
vis[n][sum][mod]=1;
for (int i=0;i<10;++i)
s[n][i][sum][mod]=f(n-1,9,sum-i,(mod-bin[n]*i%P+P)%P);
for (int i=1;i<10;++i) s[n][i][sum][mod]+=s[n][i-1][sum][mod];
}
ll f(int n,int t,int sum,int mod){
if (sum<0||n*9<sum||t<0) return 0;
if (n<1) return mod==0;
solve(n,sum,mod);
return s[n][t][sum][mod];
} int a[21],b[21],len0,len1;
int main(){
ll L,R;
scanf("%lld%lld",&L,&R);++R;
for (len0=0;L;L/=10) a[++len0]=L%10;
for (len1=0;R;R/=10) b[++len1]=R%10;
bin[1]=1;
ll ans=0;
for (P=1;P<=len1*9;++P){
for (int i=2;i<=len1;++i) bin[i]=bin[i-1]*10%P;
ll ans0,ans1;
memset(vis,0,sizeof(vis));
for (int k=0;k<2;++k){
swap(ans0,ans1);ans0=0;
for (int i=1;i<=max(len0,len1);++i) swap(a[i],b[i]);
swap(len0,len1);
int now=P,nowmod=0;
for (int i=len0;i;--i){
ans0+=f(i,a[i]-1,now,nowmod);
now-=a[i];nowmod=(nowmod-a[i]*bin[i]%P+P)%P;
}
}
ans+=ans1-ans0;
}
printf("%lld\n",ans);
return 0;
}

  

代码写的好乱……

bzoj1799: [Ahoi2009]self 同类分布的更多相关文章

  1. [BZOJ1799][Ahoi2009]self 同类分布(数位dp)

    题目描述 给出两个数 a,ba,b ,求出 [a,b][a,b] 中各位数字之和能整除原数的数的个数. 输入输出格式 输入格式: 一行,两个整数 aa 和 bb 输出格式: 一个整数,表示答案 输入输 ...

  2. BZOJ1799 [Ahoi2009]self 同类分布[数位DP]

    求出[a,b]中各位数字之和能整除原数的数的个数. 有困难的一道题.被迫看了题解:枚举每一个各位数字的和($<=162$),设计状态$f[len][sum][rest]$表示dp后面$len$位 ...

  3. 【数位dp】bzoj1799: [Ahoi2009]self 同类分布

    各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条 ...

  4. bzoj 1799: [Ahoi2009]self 同类分布 数位dp

    1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Descripti ...

  5. [Ahoi2009]self 同类分布

    1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MBSubmit: 2357  Solved: 1079[Submit][ ...

  6. BZOJ 1799 - [AHOI2009]self 同类分布 - 枚举 数位DP

    Description 找出$[L, R]$ 区间内有多少数, 各位数字和 能整除原数 Solution 枚举每个可能的数字和, 进行数位DP即可 , 水爆 Code #include<cstd ...

  7. 【BZOJ】1799: [Ahoi2009]self 同类分布

    [题意]给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1 ≤ a ≤ b ≤ 10^18 [算法]数位DP [题解] 感觉这种方法很暴力啊. 枚举数位和1~162(不能枚举0,不然会模 ...

  8. 【AHOI2009】同类分布 题解(数位DP)

    题目大意:求$[l,r]$中各位数之和能被该数整除的数的个数.$0\leq l\leq r\leq 10^{18}$. ------------------------ 显然数位DP. 搜索时记录$p ...

  9. [BZOJ1799][AHOI2009]同类分布(数位DP)

    1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MBSubmit: 1635  Solved: 728[Submit][S ...

随机推荐

  1. oracle plsql 捕获异常和抛出异常

    在写oracle存储过程的时候很多东西放到存储过程里面比如一些判断等,要比在程序逻辑里面简单很多,但是也会涉及到捕获和抛出一样的问题. 捕获异常 语法: 首先定义异常: <异常情况>  E ...

  2. linux svn

    1.回滚 一直在找svn回滚的方法,这个还是很实用的,屡试不爽阿 经常由于坑爹的需求,功能要切回到之前的某一个版本.有两种方法可以实现: 方法1: 用svn merge  1) 先 svn up,保证 ...

  3. poj1190

    生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18230 Accepted: 6491 Description 7月1 ...

  4. 05传智_jbpm与OA项目_部门模块中增加部门的jsp页面增加一个在线编辑器功能

    这篇文章讲的是在线编辑器功能,之前的部门模块中,增加部门的功能jsp页面起先是这么做的.

  5. mvc webapi 返回字符串自动加双引号

    来自:http://www.cnblogs.com/David-Huang/p/4351023.html 返回字符串,突然碰到双引号号问题,幸亏有人解决了. 返回XMLDocument类型,默认会解析 ...

  6. [转]Gson过滤字段

    原文地址:http://my.oschina.net/orgsky/blog/368768 摘要 Gson过滤字段 Gson过滤字段 Gson 过滤 字段 属性 目录[-] 最简单的用法 方法1:排除 ...

  7. Word中的字体大小

    Word中的字体大小(几号-几磅)   Word对字体大小采用两种不同的度量单位,其中一种是以"号"为度量单位,如常用的"初号.小初.一号.小一--七号.八号" ...

  8. Android -- 自定义权限

    在android系统的安全模型中,应用程序在默认的情况下不可以执行任何对其他应用程序,系统或者用户带来负面影响的操作.如果应用需要执行某些操作,就需要声明使用这个操作对应的权限. (在manifest ...

  9. 实验一 Java开发环境的熟悉

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没 ...

  10. 用python代码做configure文件

    在lua中,我一直用lua作为config文件,或者承载数据的文件 - 好处是lua本身就很好阅读,然后无需额外写解析的代码,还支持在configure文件中读环境变量,条件判断等,方便又强大! (在 ...