洛谷

这大概是我真正意义上的第一道黑题吧!

自己想出了一个大概,状态转移方程打错了一点点,最后还是得看题解。

一句话题意:求出有多少个\(n\)位的数,满足各个位置上的数字从左到右不下降,且被\(p\)整除。

刚开始没有看到数位不下降这个条件,于是自信满满的喊了一句:“这是假黑题吧!”

后来发现了,想了好久好久才找到一条规律。。。

对于任意一个\(n\)位的数,因为要求满足数位不下降,所以一定可以拆分成\(0,1,11,111,1111,11111……\)的和。

又因为数字最大是\(9\),所以就是从上述数字中任选\(9\)个的和。

于是,我敏锐的觉察到,这是一个dp题,嘿嘿~

分析了一下,由于\(n\)实在太大\((n\leq10^{18})\)所以时间复杂度肯定要去掉这个\(n\)。

然后,我们又会发现\(p\)的范围很小很小,只有\(500\),于是我们很快想到模数的循环之类的。

因为这里的所有数都是由\(0,1,11,111,1111,11111……\)组成的,又因为这些\(1\)们模上\(p\)会出现循环。

所以我们记\(cnt[i]\),表示模\(p\)为\(i\)的这些11111……

显然我们需要预处理一波\(cnt[]\)数组,直接从\(1\)枚举到\(p\)即可。

有了上面这些性质,就很好能想出如何定义状态了。

设\(f[i][j][k]\),表示枚举到了\(cnt[i]\),模\(p\)为\(j\),选了\(k\)个形如1111……的数。

那么状态转移方程就很好出来了:

\[f[i+1][(j+l*i)~\texttt{mod}~p][k+l]=(f[i][j][k]*T(l,cnt[i])+f[i+1][(j+l*i)~\texttt{mod}~p][k+l])
\]

这里的\(T(A,B)=C_{A+B-1}^{A}\)根据组合知识很容易求出。

那么差不多这题也完结了。

我本来以为会爆空间的,毕竟\(f[501][501][11]\)我开的是\(\texttt{long~long}\)。结果洛谷只有\(21\texttt{M}\)多一点点。

要注意三个问题:

  • 开长整型\(\texttt{long long}\)。
  • 为了防止前导\(0\)问题,刚开始要填满111111……
  • 最好弄个滚动数组,滚掉第一维。

代码有点丑:

#include <bits/stdc++.h>
using namespace std;
typedef int _int;
#define int long long const int mo=999911659;
int ans;
int n,p,cnt[501],beg,len,pos[501];
int A[10],c[501][11];
int f[501][501][11],a,sum; _int main()
{
cin>>n>>p;
if (n<=p) {
for (int i=1;i<=n;++i) {
sum=sum*10+1;
sum%=p;
++cnt[sum];
}
a=sum;
}
else {
for (int i=1;i<=p+1;++i) {
sum=sum*10+1;
sum%=p;
if (cnt[sum]) {
beg=pos[sum];
len=i-pos[sum];
break;
}
++cnt[sum];
pos[sum]=i;
}
for (int i=0;i<p;++i)
if (cnt[i]&&pos[i]>=beg) {
cnt[i]=(n-beg+1)/len;
if (pos[i]-beg+1<=(n-beg+1)%len)
++cnt[i];
if ((pos[i]-beg+1)%len==(n-beg+1)%len)
a=i;
}
}
A[1]=1;
for (int i=2;i<=8;++i)
A[i]=(mo-mo/i)*A[mo%i]%mo;
for (int i=0;i<p;++i) {
c[i][0]=1;
if (cnt[i])
for (int j=1;j<=8;++j) {
c[i][j]=(cnt[i]*c[i][j-1]%mo)*A[j]%mo;
++cnt[i];
cnt[i]%=mo;
}
}
f[0][a][0]=1;
for (int i=0;i<p;++i) {
for (int j=0;j<p;++j) {
for (int k=0;k<9;++k) {
for (int l=0;l<=k;++l) {
f[i+1][j][k]+=f[i][(j-(l*i%p)+p)%p][k-l]*c[i][l]%mo;
f[i+1][j][k]%=mo;
}
}
}
}
for (int i=0;i<=8;++i)
ans+=f[p][0][i],ans%=mo;
cout<<ans;
return 0;
}

洛谷 P2481 [SDOI2010]代码拍卖会的更多相关文章

  1. 洛谷 P2481 [SDOI2010]代码拍卖会(背包+隔板法)

    题面传送门 题意: 给出 \(n,p\),求有多少 \(n\) 位数 \(X=a_1a_2a_3\dots a_n\) 满足: 该 \(n\) 位数不含前导零 \(a_i \leq a_{i+1}\) ...

  2. luogu P2481 [SDOI2010]代码拍卖会

    luogu 题目中的那个大数一定是若干个1+若干个2+若干个3...+若干个9组成的,显然可以转化成9个\(\underbrace {111...1}_{a_i个1}(0\le a_1\le a_2\ ...

  3. SDOI2010代码拍卖会 (计数类DP)

    P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...

  4. BZOJ1925或洛谷2467 [SDOI2010]地精部落

    BZOJ原题链接 洛谷原题链接 先讲下关于波动数列的\(3\)个性质. 性质\(1\):对于数列中的每一对\(i\)和\(i + 1\),若它们不相邻,那么交换这两个数形成的依旧是一个波动数列. 性质 ...

  5. 洛谷 P2467 [SDOI2010]地精部落

    洛谷 我讲的应该没有这个[https://www.luogu.org/blog/user55639/solution-p2467]清楚. 贴个代码算了: #include <bits/stdc+ ...

  6. 洛谷P2468 [SDOI2010]粟粟的书架

    来了来了,随便拽一道题写题解[大雾] 最近发现自己基础奇差于是开始复习之前学过的东西,正好主席树我几乎完全没学会,然后打开洛谷试炼场… 发现了这么一道二合一的题. 这道题其实分成两个部分,前50%是一 ...

  7. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  8. [SDOI2010]代码拍卖会

    题目描述 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关 ...

  9. bzoj 1974: [Sdoi2010]代码拍卖会

    Description 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代 码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPi g不想把代码库给所有想要的小猪,只想 ...

随机推荐

  1. C#.NET中使用BackgroundWorker在模态对话框中显示进度条

    这里是一个示例,其中展示了如何使用Backgroundworker对象在模态对话框中显示后台操作的实时进度条. 首先是主窗体代码: using System; using System.Collect ...

  2. flink on yarn部分源码解析 (FLIP-6 new mode)

    我们在https://www.cnblogs.com/dongxiao-yang/p/9403427.html文章里分析了flink提交single job到yarn集群上的代码,flink在1.5版 ...

  3. linux vi/vim文本编辑

    在linux环境下,我们用的最多的文本编辑命令就是vi了,vim是vi的增强版.学习vim时候整理了一下常用的命令行,一起学习. 介绍一下vim的三种常见状态模式: 命令模式,插入模式(编辑),正常模 ...

  4. 初识layer遮罩层

    背景:楼主做了一个先删除数据再插入的功能,但是狂点菜单的时候会有重复数据插入进来,设置字段unique之后,再狂点,控制台也会报错. 为了防止这种问题出现,我采取了制止”狂点“这种行为出现的做法,所以 ...

  5. TCP会话劫持_转

    前言通常,大家所说的入侵,都是针对一台主机,在获得管理员权限后,就很是得意:其实,真正的入侵是占领整个内部网络.针对内部网络的攻击方法比较多,但比较有效的方法非ARP欺骗.DNS欺骗莫属了.但是,不管 ...

  6. kettle的job中使用循环

     job中使用循环 在一个不稳定的网络环境下作文件传输.偶尔会有超时或连接重置.这时须要稍等片刻再重试.在重试10次之后放弃并结束该job.类似使用循环解决这类问题.  该演示样例job演示了这样 ...

  7. Html就是超文本标记语言的简写,是最基础的网页语言

    Html就是超文本标记语言的简写,是最基础的网页语言. Html是通过标签来定义的语言,代码都是由标签所组成. Html代码不用区分大小写. Html代码由<html>开始</htm ...

  8. mac 安装memcache扩展问题

    执行php -i 报错: Warning: PHP Startup: memcached: Unable to initialize module Module compiled with build ...

  9. Django model :add a non-nullable field 'SKU' to product without a default; we can't do that

    You are trying to add a non-nullable field 'SKU' to product without a default; we can't do that (the ...

  10. (推荐JsonConvert )序列化和反序列化Json

    在Json文本和.Net对象之间转换最快的方法是试用JsonSerializer. JsonSerializer通过将.Net对象属性名称映射到Json属性名称,并为其复制值,将.Net对象转换为其J ...