这题口胡起来真简单。。。

先来考虑∑mi=1xi≤n,xi≥0\sum_{i=1}^{m} x_i\leq n,x_i\geq 0的整数{xi}\{x_i\}个数
这可以用插板法证明是(n+mm)n+m \choose m

对于原问题,一个经典做法是容斥,每次枚举一些数一定超过上界,其他数任意。所以答案可以表示为:

∑S∈U(−1)|S|(n+c∗|S|−|S|−∑x∈sbx+mm)\sum_{S \in U}(-1)^{|S|} {{n+c*|S|-|S|-\sum_{x \in s}b^x+m }\choose{m}}
(这里要满足n+c∗|S|−|S|−∑x∈sbx>0n+c*|S|-|S|-\sum_{x \in s}b^x>0)

可以发现,(n+mm)n+m\choose m是一个关于nn的mm次多项式,所以可以只求每种方案的k次方的和。

所以可以先枚举|S||S|,然后就能将n+c∗|S|−|S|n+c*|S|-|S|算出来。预处理一个dp(i,j,k)dp(i,j,k)表示1~i位选了j个他们的k次方的和是多少。然后考虑枚举第一个不同的数位是哪个,然后算一下。。。
复杂度O(m4)O(m^4)

#include<bits/stdc++.h>
#define maxn 60
#define mod 998244353
using namespace std;
int C[maxn][maxn],ans,dp[maxn][maxn][maxn],m,b,c;
int A[maxn],im,B[maxn],n,Q[maxn],S,len,R[maxn];
char s[maxn*maxn];
int qpow(int a,int b){int ans=1,tmp=a;for(;b;b>>=1,tmp=1ll*tmp*tmp%mod)if(b&1)ans=1ll*ans*tmp%mod;return ans;
}
int getdiv(int b){int sum=0;for(int i=n;i>=1;--i){long long x=10ll*sum+s[i];s[i]=x/b,sum=x%b;}while(n&&!s[n])n--;return sum;
}
bool add(int c){int ret=c;for(int i=1;i<=len&&ret;++i)if(Q[i]+ret<0)Q[i]=b+Q[i]+ret,ret=-1;else if(Q[i]+ret>=b)Q[i]=Q[i]+ret-b,ret=1;else Q[i]=Q[i]+ret,ret=0;while(len&&!Q[len])len--;if(ret<0)return false;return true;
}
void print(int ans){static int cas=0;printf("Case #%d: %d\n",++cas,ans);
}
void cal(int i,int j,int nz){if(i<0)return ;for(int k=0;k<=m;++k)for(int nk=0,l=1;nk<=k&&l;++nk,l=1ll*l*nz%mod)if(dp[j][i][k-nk])R[k]=(R[k]+1ll*dp[j][i][k-nk]*l%mod*C[k][nk]%mod*(k-nk&1?mod-1:1))%mod;
//          printf("[%d,%d:%d]\n",nz,k,nk);
}
int main(){while(scanf("%d%d%d",&m,&b,&c)==3){scanf("%s",s+1),n=strlen(s+1),S=len=0;for(int i=1;i<=n;++i)s[i]-='0';reverse(s+1,s+n+1);if(n==1&&s[1]==0){print(0);continue;}for(int i=1,ret=1;i<=n&&ret;++i)if(s[i]-ret<0)s[i]=10+s[i]-ret,ret=1;else s[i]-=ret,ret=0;while(n&&!s[n])n--;while(n)Q[++len]=getdiv(b);for(int i=0;i<=m;++i)for(int j=*C[i]=1;j<=i;++j)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;im=1,B[0]=1;for(int i=1;i<=m;++i)B[i]=1ll*B[i-1]*b%mod;for(int i=1;i<=m;++i)im=1ll*im*i%mod;im=qpow(im,mod-2);memset(A,0,sizeof(A)),A[0]=1;for(int i=0;i<=m-1;++i)for(int j=i;j>=0;--j)A[j+1]=(A[j+1]+A[j])%mod,A[j]=1ll*(m-i)*A[j]%mod;for(int i=1,j=1;i<=len;++i,j=1ll*j*b%mod)S=(S+1ll*j*Q[i])%mod;
//      for(int i=0;i<=m;++i)printf("[%d]",A[i]);puts("");for(int i=0;i<=m;++i)A[i]=1ll*A[i]*im%mod;memset(dp,0,sizeof(dp));dp[0][0][0]=1;for(int i=1;i<=len&&i<=m;++i)for(int j=0;j<=i;++j)for(int k=0;k<=m;++k){dp[i][j][k]=dp[i-1][j][k];if(j)for(int l=0,z=1;l<=k;++l,z=1ll*z*B[i]%mod)if(dp[i-1][j-1][k-l])dp[i][j][k]=(dp[i][j][k]+1ll*dp[i-1][j-1][k-l]*C[k][l]%mod*z)%mod;
//                  if(dp[i][j][k])printf("dp[%d][%d][%d]=%d\n",i,j,k,dp[i][j][k]);}int ans=0;for(int i=0,dx=1;i<=m;++i,dx=mod-dx){int sum=0;if(!len){ans=(ans+1ll*C[m][i]*dx)%mod;if(!add(c-1))break;continue;}for(int j=0;j<=m;++j)R[j]=0;int x=0,z=0;
//          printf("{%d}",len);for(int j=len;j>=2&&x<=i;--j)if(Q[j]){
//              printf("call:[%d,%d,%d]",i-x,j-2,S-z);cal(i-x,j-2,(S-z+mod)%mod);x++,z=(z+B[j-1])%mod;if(j-1>m)goto nxt;if(Q[j]>1){cal(i-x,j-2,(S-z+mod)%mod);goto nxt;}}if(i==x){for(int j=0,l=1;j<=m&&l;j++,l=1ll*l*(S-z+mod)%mod)R[j]=(R[j]+l)%mod;}nxt:;
//          printf("\n[i=%d]\n",i);
//          for(int j=0;j<=m;++j)printf("[%d]",R[j]);for(int j=0;j<=m;++j)sum=(sum+1ll*R[j]*A[j])%mod;ans=(ans+1ll*sum*dx)%mod;if(!add(c-1))break;S=(1ll*S+c-1+mod)%mod;}print(ans);}
}

UNR#2 梦中的题面 HDU6056相关推荐

  1. 两个矩阵是否相交的算法_刷透近200道数据结构与算法,成功加冕“题王”,挤进梦中的字节!...

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...

  2. 一看“左程云:200道算法与数据结构”,二刷“阿里云:70+算法题、30种大厂笔试高频知识点”,3月过去终于挺进我梦中的字节!

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...

  3. 刷透近200道数据结构与算法,成功加冕“题王”,挤进梦中的字节

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2022年就将过去一半,那么如何才能在后半年弯道超车,进入梦寐以求的大厂呢? 首先你要清楚,现在无论是大厂还是小公司,面试考察的 ...

  4. 【暑期每日一题】洛谷 P1554 梦中的统计

    题目链接:P1554 梦中的统计 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 Bessie 处于半梦半醒的状态.过了一会儿,她意识到她在数数,不能入睡. 题目描述 Be ...

  5. 【BZOJ 3620】 3620: 似乎在梦中见过的样子 (KMP)

    3620: 似乎在梦中见过的样子 Time Limit: 15 Sec  Memory Limit: 128 MB Submit: 755  Solved: 445 Description " ...

  6. 第2部分 字符串算法(提高篇)--第2章 KMP算法1469:似乎在梦中见过的样子

    1469:似乎在梦中见过的样子 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 476 通过数: 159 [题目描述] 原题来自:2014 年湖北省队互测 Week2 「Madok ...

  7. 2022-6-5 括号之价,最长配对,梦中岛之路,小Biu的旅行,最小正子段和,小b和排序,顺子,重排列得到2的幂,重排列,和为K的倍数,低买高卖,小b删列

    1. 括号之价 [栈] 小Y上数据结构课的时候摸鱼,听到老师在讲用栈做括号匹配,于是乎边随意写了一个合法的括号序列.但是光是写括号太无聊了,他现在想知道这个括号序列的价值.他是这样定义一个括号序列的价 ...

  8. 洛谷P1554——梦中的统计 解法(C++)

    Hi 让大家久等了 今天再再再再再再再再再再再...来一道洛谷的题 梦中的统计(你们是不是已经厌烦了洛谷) 老规矩,先上个题目传送门(点击蓝字即可观看) 题目背景 Bessie 处于半梦半醒的状态.过 ...

  9. 一起讨论系统架构设计师考试大纲中样题参考答案

    欢迎你的到来,一起学习,共同进步. 系统架构设计师考试大纲中样题参考答案 一起讨论系统架构设计师考试大纲中样题参考答案. (一)选择题 1. B  A  D 2. B (二)问答题 --(期待你的跟贴 ...

最新文章

  1. O - Layout POJ - 3169(差分约束)
  2. python 中super方法的调用
  3. python easygui_极客养成记/Python一点也不难/第四节
  4. 深入理解C/C++函数指针
  5. windows更改pip源_windows环境下 更换pip镜像源
  6. c++ 捕获所有异常
  7. c语言编写的贪吃蛇代码,刚学C语言,想写一个贪吃蛇的代码
  8. websocket使用指南
  9. java程序a-z b-y_请完成下列Java程序:对大写的26个英文字母加密,从键盘输入一个大写字母串..._考试资料网...
  10. ubuntu 如何确定虚拟机中的网关_如何在虚拟机中安装Kali Linux
  11. ​有哪些比较好的录制游戏视频软件​,游戏录屏软件哪个好用
  12. Til the Cows Come Home POJ - 2387
  13. el表达试中三元用法
  14. 常用的DOS命令大全
  15. Mac上使用Emacs
  16. python好看图案的编程代码_只需15行Python代码,实现图像定位功能
  17. swiper修改轮播图下面小圆圈样式
  18. 怎么用python制作随机点名软件_如何用python编写一个简易的随机点名软件
  19. SCI和国自然标书的难度对比,谁更难?
  20. 【附源码】Java计算机毕业设计民宿客栈管理系统(程序+LW+部署)

热门文章

  1. 新版标准日本语高级_第19课
  2. DNS与HTTPDNS
  3. 贝叶斯估计和极大似然估计到底有何区别
  4. html 按钮默认值,button_标签 | Elements_HTML_参考手册_非常教程
  5. 计算机音乐创作是什么,计算机音乐创作,creation of computer music,音标,读音,翻译,英文例句,英语词典...
  6. js关闭浏览器当前页(iframe)
  7. 数学建模系列-预测模型(一)灰色预测模型
  8. 白光干涉仪(光学3D表面轮廓仪)与台阶仪的区别
  9. H.266/VVC相关技术学习笔记16:VTM6.0中的CIIP技术(帧内帧间联合预测)
  10. Android 错把setLayerType当成硬件加速