luogu

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

然后模数只有500,所以可以考虑处理出所有\(\mod p =i\)的不同长度的\(111...1\)个数记为\(cnt_i\),考虑dp求答案,设\(f_{i,j,k}\)表示考虑了前\(i\)个剩余类,用了\(j\)个\(111...1\),得到的数\(\mod p =k\)的方案.注意选出来的\(111...1\)不同当且仅当对应的\(a\)序列排序后不同,并且只有模\(p\)相同的\(111...1\)才有可能有影响.转移枚举当前这个类选了多少个j,然后转移系数就是\(cnt_i\)种数中选\(j\)个的方案,这个就等于\(\binom{j+cnt_i-1}{j}\),最后答案为\(f_{p-1,8,p-(\underbrace {111...1}_{n个1}\mod p)}\),因为没有前导0,要至少包含一个\(\underbrace {111...1}_{n个1}\)

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double using namespace std;
const int N=500+10,mod=999911659;
LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
void ad(int &x,int y){x+=y,x-=x>=mod?mod:0;}
LL n,mi[N],a[N];
int p,sz,f[2][9][N],g[9],inv[9];
bool cr[N];
int C(LL a,int b)
{
a%=mod;
int an=1;
for(int i=1;i<=b;++i,--a)
an=1ll*an*a%mod*inv[i]%mod;
return an;
} int main()
{
n=rd(),p=rd();
inv[0]=inv[1]=1;
for(int i=2;i<=8;++i) inv[i]=(mod-1ll*mod/i*inv[mod%i]%mod)%mod;
memset(mi,0x3f3f3f,sizeof(mi));
mi[0]=0;
for(int i=1%p,j=1;!cr[i];i=(10ll*i+1)%p,++j)
{
if(mi[i]>j) mi[i]=j;
else cr[i]=1,++sz;
}
for(int i=0;i<p;++i)
{
if(cr[i]) a[i]=max(0ll,(n-mi[i]+sz)/sz);
else a[i]=n>=mi[i];
}
int nw=1,la=0;
f[la][0][0]=1;
g[0]=1;
for(int i=0;i<p;++i)
{
if(!a[i]) continue;
for(int j=1;j<=8;++j) g[j]=C(j+a[i]-1,j);
for(int j=0;j<=8;++j)
for(int k=0;k<p;++k)
{
if(!f[la][j][k]) continue;
for(int l=0;j+l<=8;++l)
ad(f[nw][j+l][(k+l*i)%p],1ll*f[la][j][k]*g[l]%mod);
f[la][j][k]=0;
}
nw^=1,la^=1;
}
int kk=-1;
for(int i=0;i<p;++i)
if(n==mi[i]||(cr[i]&&(n-mi[i])%sz==0)){kk=(p-i)%p;break;}
printf("%d\n",f[la][8][kk]);
return 0;
}

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

  1. 洛谷 P2481 [SDOI2010]代码拍卖会

    洛谷 这大概是我真正意义上的第一道黑题吧! 自己想出了一个大概,状态转移方程打错了一点点,最后还是得看题解. 一句话题意:求出有多少个\(n\)位的数,满足各个位置上的数字从左到右不下降,且被\(p\ ...

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

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

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

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

  4. [SDOI2010]代码拍卖会

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

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

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

  6. [BZOJ1974][SDOI2010]代码拍卖会[插板法]

    题意 询问有多少个数位为 \(n\) 的形如 \(11223333444589\) 的数位值不下降的数字在\(\mod p\) 的意义下同余 \(0\). $n\leq 10^{18} ,p\leq ...

  7. [SDOI2010]代码拍卖会——DP

    原题戳这里 绝对是一道好题 需要注意到两个东西 1.符合条件的数可以拆成一堆\(11...11\)相加的形式,比如\(1145=1111+11+11+11+1\) 2.\(1,11,111,1111, ...

  8. Luogu2481 SDOI2010 代码拍卖会 DP、组合

    传送门 神仙DP 注意到\(N \leq 10^{18}\),不能够直接数位DP,于是考虑形成的\(N\)位数的性质. 因为低位一定不会比高位小,所以所有满足条件的\(N\)位数一定是不超过\(9\) ...

  9. BZOJ 1974: [Sdoi2010]auction 代码拍卖会( dp )

    在1, 11, 111……中选<=8个, + 11..(n个1)拼出所有可能...这些数mod p至多有p中可能, 找出循环的处理一下. 那么dp就很显然了...dp(i, j, k)表示前i种 ...

随机推荐

  1. Express + Mongoose 极简入门

    今天尝试使用express + mongoose,构建了一个简单的Hello world,实现以下功能: 定义mongodb使用的Schema,一个User 访问/输出Hello world 访问/i ...

  2. python实战,

    1.把日志状态码为200得请求记录下来 记录信息(ip,访问时间,请求资源) 封装函数再次调用,健壮性try except #coding=utf-8import redef  aclog(path, ...

  3. yconsole使用说明

    介绍: yconsole是yhd用于管理缓存的工具(python实现),它的主要功能是为各个应用分配和管理缓存,以及错误修复.和它配合使用的还有ycache-client.yagent.zookeep ...

  4. openssl生成秘钥对

    openssl genrsa -out pri.pem openssl rsa -in pri.pem -out pub.pem -pubout 这样就生成秘钥对了,其中pri.pem是私钥,pub. ...

  5. mingw gcc 静态 static 编译 dav1d libdav1d.a

    export CC=/mingw/bin/gcc export CXX=/mingw/bin/g++ meson --prefix "/usr/local" build --bui ...

  6. Web09_MySQL多表&JDBC

    使用JDBC发送insert语句完成单表[添加]操作 使用JDBC发送update语句完成单表[更新]操作 使用JDBC发送delete语句完成单表[删除]操作 使用JDBC发送select语句完成单 ...

  7. Conetos 下安装docker 和镜像加速

    首先升级yum yum update 安装yum-utils,它提供yum-config-manager可以用来配置repo yum install -y yum-utils 使用以下命令设置稳定版 ...

  8. Maven使用基础

    (转)https://my.oschina.net/xiaomaoandhong/blog/104045 基于 约定优于配置(Convention Over Configuration)的原则,无特殊 ...

  9. ios模拟器快捷键

    shift+cmd+h  返回桌面 cmd+5或者4或者3  可以直接调节大小 cmd+R运行项目 cmd+R弹出键盘 ios模拟器弹出键盘 在xcode6中, 模拟器中的键盘和电脑的键盘可以进行绑定 ...

  10. python 并发编程 多线程 Thread对象的其他属性或方法

    介绍 Thread实例对象的方法 # isAlive(): 返回线程是否活动的. # getName(): 返回线程名. # setName(): 设置线程名. threading模块提供的一些方法: ...