好繁琐,因为难处理,分为k==0和k!=0两类处理。

代码很丑。。。手残伤不起。。。

//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cctype>
#include<string>
#include<algorithm>
#include<iostream>
#include<ctime>
#include<map>
#include<set>
using namespace std;
#define MP(x,y) make_pair((x),(y))
#define PB(x) push_back(x)
typedef long long LL;
//typedef unsigned __int64 ULL;
/* ****************** */
const int INF=100011122;
const double INFF=1e100;
const double eps=1e-8;
const int mod=20120427;
const int NN=1005;
const int MM=1000010;
/* ****************** *///保证没有0
int sum[19][55][37][19][19];
int dp[19][55][37][19][19];
LL pp10[20];
int a[20];
int jian[10][4];//用于计算k==0
LL dp0[20][3];
LL sum0[20][3];
/*
0:有中间0
1:只有前导0
2:无0
*/void INC(int &a,LL b)
{b%=mod;a+=b;if(a>=mod)a-=mod;
}void init(int n)
{int i,j1,j2,j3,j4;LL t,tt;memset(sum,0,sizeof(sum));memset(dp,0,sizeof(dp));memset(dp0,0,sizeof(dp0));memset(sum0,0,sizeof(sum0));//0jian[0][0]=0;jian[0][1]=0;jian[0][2]=0;jian[0][3]=0;//1jian[1][0]=0;jian[1][1]=0;jian[1][2]=0;jian[1][3]=0;//2jian[2][0]=1;jian[2][1]=0;jian[2][2]=0;jian[2][3]=0;//3jian[3][0]=0;jian[3][1]=1;jian[3][2]=0;jian[3][3]=0;//4jian[4][0]=2;jian[4][1]=0;jian[4][2]=0;jian[4][3]=0;//5jian[5][0]=0;jian[5][1]=0;jian[5][2]=1;jian[5][3]=0;//6jian[6][0]=1;jian[6][1]=1;jian[6][2]=0;jian[6][3]=0;//7jian[7][0]=0;jian[7][1]=0;jian[7][2]=0;jian[7][3]=1;//8jian[8][0]=3;jian[8][1]=0;jian[8][2]=0;jian[8][3]=0;//9jian[9][0]=0;jian[9][1]=2;jian[9][2]=0;jian[9][3]=0;pp10[0]=1;for(i=1;i<=19;i++){pp10[i]=pp10[i-1]*10%mod;}dp0[0][2]=1;for(i=0;i<n;i++){if(dp0[i][0] || sum0[i][0]){dp0[i+1][0]+=dp0[i][0]*10;dp0[i+1][0]%=mod;sum0[i+1][0]+=sum0[i][0]*10;t=(LL)(dp0[i][0]*45%mod)*pp10[i];t%=mod;sum0[i+1][0]+=t;sum0[i+1][0]%=mod;}if(dp0[i][1] || sum0[i][1]){//0dp0[i+1][1]+=dp0[i][1];dp0[i+1][1]%=mod;sum0[i+1][1]+=sum0[i][1];sum0[i+1][1]%=mod;//!0dp0[i+1][0]+=dp0[i][1]*9;dp0[i+1][0]%=mod;sum0[i+1][0]+=sum0[i][1]*9;t=(LL)(dp0[i][1]*45%mod)*pp10[i];t%=mod;sum0[i+1][0]+=t;sum0[i+1][0]%=mod;}if(dp0[i][2] || sum0[i][2]){//0dp0[i+1][1]+=dp0[i][2];dp0[i+1][1]%=mod;sum0[i+1][1]+=sum0[i][2];sum0[i+1][1]%=mod;//!0dp0[i+1][2]+=dp0[i][2]*9;dp0[i+1][2]%=mod;sum0[i+1][2]+=sum0[i][2]*9;t=(LL)(dp0[i][2]*45%mod)*pp10[i];t%=mod;sum0[i+1][2]+=t;sum0[i+1][2]%=mod;}}dp[0][0][0][0][0]=1;for(i=0;i<n;i++)for(j1=0;j1<=54;j1++)for(j2=0;j2<=36;j2++)for(j3=0;j3<=18;j3++)for(j4=0;j4<=18;j4++){if(dp[i][j1][j2][j3][j4] || sum[i][j1][j2][j3][j4]){t=dp[i][j1][j2][j3][j4];tt=sum[i][j1][j2][j3][j4];//1dp[i+1][j1][j2][j3][j4]+=t;dp[i+1][j1][j2][j3][j4]%=mod;INC(sum[i+1][j1][j2][j3][j4],tt);INC(sum[i+1][j1][j2][j3][j4],t*pp10[i]);//2dp[i+1][j1+1][j2][j3][j4]+=t;dp[i+1][j1+1][j2][j3][j4]%=mod;INC(sum[i+1][j1+1][j2][j3][j4],tt);INC(sum[i+1][j1+1][j2][j3][j4],t*pp10[i]*2);//3dp[i+1][j1][j2+1][j3][j4]+=t;dp[i+1][j1][j2+1][j3][j4]%=mod;INC(sum[i+1][j1][j2+1][j3][j4],tt);INC(sum[i+1][j1][j2+1][j3][j4],t*pp10[i]*3);//4dp[i+1][j1+2][j2][j3][j4]+=t;dp[i+1][j1+2][j2][j3][j4]%=mod;INC(sum[i+1][j1+2][j2][j3][j4],tt);INC(sum[i+1][j1+2][j2][j3][j4],t*pp10[i]*4);//5dp[i+1][j1][j2][j3+1][j4]+=t;dp[i+1][j1][j2][j3+1][j4]%=mod;INC(sum[i+1][j1][j2][j3+1][j4],tt);INC(sum[i+1][j1][j2][j3+1][j4],t*pp10[i]*5);//6dp[i+1][j1+1][j2+1][j3][j4]+=t;dp[i+1][j1+1][j2+1][j3][j4]%=mod;INC(sum[i+1][j1+1][j2+1][j3][j4],tt);INC(sum[i+1][j1+1][j2+1][j3][j4],t*pp10[i]*6);//7dp[i+1][j1][j2][j3][j4+1]+=t;dp[i+1][j1][j2][j3][j4+1]%=mod;INC(sum[i+1][j1][j2][j3][j4+1],tt);INC(sum[i+1][j1][j2][j3][j4+1],t*pp10[i]*7);//8dp[i+1][j1+3][j2][j3][j4]+=t;dp[i+1][j1+3][j2][j3][j4]%=mod;INC(sum[i+1][j1+3][j2][j3][j4],tt);INC(sum[i+1][j1+3][j2][j3][j4],t*pp10[i]*8);//9dp[i+1][j1][j2+2][j3][j4]+=t;dp[i+1][j1][j2+2][j3][j4]%=mod;INC(sum[i+1][j1][j2+2][j3][j4],tt);INC(sum[i+1][j1][j2+2][j3][j4],t*pp10[i]*9);}}dp[0][0][0][0][0]=0;for(i=2;i<=n;i++)for(j1=0;j1<=54;j1++)for(j2=0;j2<=36;j2++)for(j3=0;j3<=18;j3++)for(j4=0;j4<=18;j4++){dp[i][j1][j2][j3][j4]+=dp[i-1][j1][j2][j3][j4];if(dp[i][j1][j2][j3][j4]>=mod)dp[i][j1][j2][j3][j4]-=mod;sum[i][j1][j2][j3][j4]+=sum[i-1][j1][j2][j3][j4];if(sum[i][j1][j2][j3][j4]>=mod)sum[i][j1][j2][j3][j4]-=mod;}
}
LL dfs_sum(int pos,int n1,int n2,int n3,int n4,LL t_sum,bool fg,bool allzero)
{if(pos==0){if(n1==0 && n2==0 && n3==0 && n4==0)return t_sum;return 0;}if(!fg){if(allzero){return sum[pos][n1][n2][n3][n4];}else{LL temp=sum[pos][n1][n2][n3][n4]-sum[pos-1][n1][n2][n3][n4];if(temp<0)temp+=mod;LL temp1=dp[pos][n1][n2][n3][n4]-dp[pos-1][n1][n2][n3][n4];if(temp1<0)temp1+=mod;temp+=t_sum*temp1;temp%=mod;return temp;}}int i;LL ans=0;if(allzero)i=0;elsei=1;for(;i<=a[pos];i++){int m1=n1-jian[i][0];int m2=n2-jian[i][1];int m3=n3-jian[i][2];int m4=n4-jian[i][3];if(m1>=0 && m2>=0 && m3>=0 && m4>=0){ans+=dfs_sum(pos-1,m1,m2,m3,m4,(t_sum+i*pp10[pos-1])%mod,i==a[pos],allzero&&(i==0));if(ans>=mod)ans-=mod;}}return ans;
}
LL calc(LL x,int n1,int n2,int n3,int n4)
{int tol=0;do{a[++tol]=x%10;x/=10;}while(x);return dfs_sum(tol,n1,n2,n3,n4,0,1,1);
}
LL solve(LL st,LL en,int n1,int n2,int n3,int n4)
{LL ans=calc(en,n1,n2,n3,n4)-calc(st-1,n1,n2,n3,n4);if(ans<0)ans+=mod;return ans;
}LL dfs_zero_sum(int pos,LL t_sum,bool ok,bool fg,bool allzero)
{if(pos==0){if(ok)return t_sum;return 0;}if(!fg){if(ok){LL temp=pp10[pos-1]*(pp10[pos]-1)*5;temp%=mod;if(temp<0)temp+=mod;temp+=t_sum*pp10[pos];temp%=mod;return temp;}else{LL temp=sum0[pos][0];temp+=t_sum*dp0[pos][0];temp%=mod;if(!allzero){temp+=sum0[pos][1];temp%=mod;temp+=t_sum*dp0[pos][1]%mod;temp%=mod;}return temp;}}int i;LL ans=0;bool ok1;for(i=0;i<=a[pos];i++){ok1=ok;if(i==0 && !allzero)ok1=true;ans+=dfs_zero_sum(pos-1,(t_sum+i*pp10[pos-1])%mod,ok1,i==a[pos],allzero&&(i==0));if(ans>=mod)ans-=mod;}return ans;
}LL calc_zero(LL x)
{int tol=0;do{a[++tol]=x%10;x/=10;}while(x);return dfs_zero_sum(tol,0,0,1,1);
}void solve_zero(LL st,LL en)
{LL ans=calc_zero(en)-calc_zero(st-1);if(ans<0)ans+=mod;printf("%lld\n",ans);
}int main()
{init(18);int cas;int n1,n2,n3,n4;LL st,en,k,ans;scanf("%d",&cas);while(cas--){scanf("%lld%lld%lld",&st,&en,&k);if(k==0){solve_zero(st,en);continue;}n1=n2=n3=n4=0;while(k%2==0){n1++;k/=2;}while(k%3==0){n2++;k/=3;}while(k%5==0){n3++;k/=5;}while(k%7==0){n4++;k/=7;}if(k>1 || n1>54 || n2>36 || n3>18 || n4>18){ans=0;}else{ans=solve(st,en,n1,n2,n3,n4);}printf("%lld\n",ans);}return 0;
}

BZOJ 2757: [SCOI2012]Blinker的仰慕者 数位DP相关推荐

  1. 数位dp BZOJ 2757: [SCOI2012]Blinker的仰慕者

    2757: [SCOI2012]Blinker的仰慕者 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 562  Solved: 133 [Submi ...

  2. SCOI2012 Blinker的仰慕者 BZOJ 2757

    2757: [SCOI2012]Blinker的仰慕者 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1038 Solved: 291 Descrip ...

  3. bzoj2757: [SCOI2012]Blinker的仰慕者

    bzoj2757: [SCOI2012]Blinker的仰慕者 Description Blinker 有非常多的仰慕者,他给每个仰慕者一个正整数编号.而且这些编号还隐藏着特殊的意义,即编号的各位数字 ...

  4. BZOJ2757 : [SCOI2012]Blinker的仰慕者

    BZOJ AC900题纪念~~ 若K>0,则 设f[i][j]表示i位数字,积为j的数字的个数 g[i][j]表示i位数字,积为j的数字的和 DP+Hash预处理 查询时枚举LCP然后统计贡献 ...

  5. BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...

  6. [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】

    题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...

  7. bzoj 1799: [Ahoi2009]self 同类分布(数位DP)

    1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MB Submit: 1358  Solved: 592 [Submit] ...

  8. 牛客网dp专题 数位dp

    文章目录 数位dp 例题: NC116652 uva11038 How many 0's NC15035 送分了QAQ NC20669 诡异数字 NC20665 7的意志 NC17385 Beauti ...

  9. [ BZOJ 2757 ]Blinker的仰慕者

    Blinker的仰慕者[L,R] 之间满足各位数字乘积为\(k\) 的数字有多少个.\((L,R \leq 10^{18})\) \(f[i][j][k]:\) 前\(i\)位数,\(j\)代表与上限 ...

最新文章

  1. 文言文能编程了,口水战也开始了
  2. 数据库跟缓存的双写一致性
  3. mysql生成随机验证码_MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法...
  4. 操作系统原理:页置换算法,FIFO,LRU,Clock,LFU,二次机会法
  5. java精确测量文本高度_基于文本精确计算UITableViewCell的高度
  6. element upload预览_vue element upload实现图片本地预览
  7. C#中的异步调用剖析
  8. 发展需要大师,繁荣更需批评——GIS现状堪忧
  9. android 7 audio架构,7.2.1 Audio系统的各个层次
  10. 数字时钟word clock Mac设置教程
  11. 修复计算机命令行,命令提示符修复系统方法
  12. 青龙-闪电世界(脚本更新)
  13. es的refresh和flush介绍
  14. PAT a1134
  15. java MP4 解析 第一步 解析ftyp box
  16. Android SDK 详解
  17. Python进行股票分析
  18. Satpy基础系列教程(1)-FY4A AGRI L1数据处理
  19. pythonturtle画飞机_浅谈pygame编写外星人入侵游戏第一步(屏幕上绘制飞机)......
  20. 微信小程序导航栏或菜单栏吸顶效果简单实现

热门文章

  1. android spinner,自定义字体大小颜色背景位置
  2. 413:Calling Extraterrestrial Intelligence Again(翻译 )
  3. 【汇正财经】股票成交原则有哪些?竞价交易呢?
  4. system.exe,alien32.exe,ftsKetNt.7ps,SysKetNt.Sys, iexpe.exe等1
  5. 飞蛾投火式的瞬间灿烂
  6. 元祖python_Python ---元祖
  7. [深度学习] OpenVINO开发:Win 10 安装及卸载
  8. Win7安装.net4.0失败如何解决_离水的鱼_新浪博客
  9. 关于前端的一些学习记录(1)
  10. LeetCode第 310 场周赛