pjudge#21652-[PR #4]到底有没有九【数位dp】

1|0正题

题目链接:http://pjudge.ac/problem/21652


1|1题目大意

给出一个正整数k,求第nx满足x×(10k1)中没有一个数位为9

1n1018,1k18


1|2解题思路

首先是从高位到低位逐步确定答案,但是直接暴力算乘法肯定很麻烦,我们考虑反过来做。

我们算第n个合法的x×(10k1),然后再除以10k1

那么现在问题就是给定一些确定的位,求剩下的位有多少种不含9的组法能够拼出10k1的倍数。

然后一个数10k1的倍数的条件就是将它每k位分割一次提出来求和,如果是10k1的倍数就合法。

段数不会太多,我们可以暴力枚举10k1的倍数,然后数位dp求解。

细节有点多。


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #define ll __int128 using namespace std; const int W=40; int k,a[80],b[80]; ll n,f[80][10]; ll read(){ ll x=0,f=1;char c=getchar(); while(!isdigit(c)){if(c=='-')f=-f;c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();} return x*f; } void print(ll x) {if(x>9)print(x/10);putchar(x%10+'0');return;} ll solve(){ int L=(W+k-1)/k;ll pw=1,ans=0; for(int i=1;i<=k;i++)pw=pw*(ll)10;pw--; for(int d=1;d<=L;d++){ ll p=d*pw; for(int i=0;i<k;i++) b[i]=p%10,p/=10; memset(f,0,sizeof(f));f[0][0]=1; for(int i=0;i<k;i++){ for(int z=0;z<L;z++) for(int x=(z==0);x<10;x++) f[z/10][z%10]+=f[z][x],f[z][x]=0; for(int j=0;j<L;j++) for(int z=L-1;z>=0;z--) for(int x=9;x>=0;x--){ if(!f[z][x])continue; ll r=f[z][x];f[z][x]=0; if(a[j*k+i]==-1) for(int y=8;y>=0;y--) f[z+(x+y)/10][(x+y)%10]+=r; else f[z+(x+a[j*k+i])/10][(x+a[j*k+i])%10]+=r; } for(int z=0;z<L;z++) for(int x=0;x<10;x++) if(x!=b[i])f[z][x]=0; } for(int x=0;x<10;x++)ans+=f[p][x]; } return ans; } signed main() { k=read();n=read(); ll now=0,las;int m=(W+k-1)/k*k; for(int i=0;i<m;i++)a[i]=-1; for(int i=m-1;i>=0;i--){ a[i]=0;now+=(las=solve()); while(now<n){ a[i]++; now+=(las=solve()); } now-=las; } ll ans=0;//print(now); for(int i=m-1,flag=0;i>=0;i--) ans=ans*(ll)10+a[i]; ll pw=1; for(int i=0;i<k;i++)pw=pw*(ll)10; pw=pw-1;ans/=pw; print(ans); return 0; } //1 8

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/16482586.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(99)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-07-15 AT2305-[AGC010D]Decrementing【博弈论】
2021-07-15 AT5661-[AGC040C]Neither AB nor BA【模型转换】
2021-07-15 CF573D-Bear and Cavalry【动态dp】
2021-07-15 CometOJ-[Contest #10]鱼跃龙门【exgcd】
2021-07-15 jzoj5101-[GDOI2017day2]凡喵识图【鸽笼原理】
2021-07-15 P1791-[国家集训队]人员雇佣【最大权闭合图】
点击右上角即可分享
微信分享提示