Description

随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代

码库。猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库。iPi

g不想把代码库给所有想要的小猪,只想给其中的一部分既关系好又

肯出钱的小猪,于是他决定举行了一个超大型拍卖会。 在拍卖会上

,所有的N头小猪将会按照和iPig的好感度从低到高,从左到右地在i

Pig面前站成一排。每个小猪身上都有9猪币(与人民币汇率不明),

从最左边开始,每个小猪依次举起一块牌子,上面写上想付出的买代

码库的猪币数量(1到9之间的一个整数)。大家都知道,如果自己付

的钱比左边的猪少,肯定得不到梦寐以求的代码库,因此从第二只起

,每只猪出的钱都大于等于左边猪出的价钱。最终出的钱最多的小猪

(们)会得到iPig的代码库真传,向着保送PKU(Pig Kingdom Unive

rsity)的梦想前进。 iPig对自己想到的这个点子感到十分满意,在

去现场的路上,iPig就在想象拍卖会上会出现的场景,例如一共会出

现多少种出价情况之类的问题,但这些问题都太简单了,iPig早已不

敢兴趣了,他想要去研究更加困难的问题。iPig发现如果他从台上往

下看,所有小猪举的牌子从左到右将会正好构成一个N位的整数,他

现在想要挑战的问题是所有可能构成的整数中能正好被P整除的有多

少个。由于答案过大,他只想要知道答案mod 999911659就行了。

Input

一行:两个数N(1≤N≤10^18)、P(1≤P≤500),用一个空格分开。

Output

一行:一个数,表示答案除以999911659的余数。

Sample Input

2 3

Sample Output

15

样例解释

方案可以是:12 15 18 24 27 33 36 39 45 48 57 66 69 78 99,共15种。

解题报告:

这题真的可以玩死人啊,见过的最恶心,没有之一,首先要明白,这题中因为存在数列递增的性质,所以可以拆成1,11,111,1111,11111...中任意选9个以下的数字的和构成的数字,这也是此题给我的最大启发.

然后就是DP,首先看数据范围我们只能从p下手,我们先预处理出1,11,111...中cnt[i]表示mod P后==i的数的个数,这个可以发现是循环的,处理完这里你就胜利了,DP十分简单,定义f[i][j][k] 表示已经处理到了前cnt[i],和mod P为j,一共用了k个数字的方案,容易看出f[i+1][(j+l×i)][k+l]=f[i][j][k]×C[cnt[i]+l-1][l],C[cnt[i]+l-1][l] 是从cnt[i]个中选出l个的可重组合方案

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long n;
int k,f[505][10][505],dep[505],inv[10],c[505][10];
long long cnt[505];
long long p=999911659;
int main()
{ scanf("%lld%d",&n,&k);
int s=0;
cnt[0]++;
int beg,len;
if(n<=k)for(int i=1;i<=n;i++)cnt[s=(s*10+1)%k]++,cnt[s]%=p;
else
{ for(int i=1;i<=k+1;i++)
{ s=(s*10+1)%k;
if(cnt[s])
{ beg=dep[s];
len=i-dep[s];
break;
}
cnt[s]++;
dep[s]=i;
}
for(int i=0;i<k;i++)if(cnt[i]>0&&dep[i]>=beg)
{ cnt[i]=(n-beg+1)/(long long)len%p;
if((dep[i]-beg+1)<=(n-beg+1)%(long long)len)cnt[i]=(cnt[i]+1)%p;
if((dep[i]-beg+1)%(long long)len==(n-beg+1)%(long long)len)s=i;
}
}
inv[1]=1;
for(int i=2;i<=8;i++)inv[i]=p-(long long)(p/i)*inv[p%i]%p;
memset(f,0,sizeof 0);
memset(c,0,sizeof c);
for(int i=0;i<k;i++)
{ c[i][0]=1;
for(int j=1;j<=8;j++)
{ c[i][j]=cnt[i]*c[i][j-1]%p*inv[j]%p;
cnt[i]++;
cnt[i]%=p;
}
}
f[0][0][s]=1;
for(int i=0;i<k;i++)
{ for(int j=0;j<9;j++)
{ for(int x=0;x<k;x++)
{ for(int y=0;y<=j;y++)
{ f[i+1][j][x]=(f[i+1][j][x]+(long long)f[i][j-y][(x-y*i%k+k)%k]*c[i][y]%p)%p;
}
}
}
}
printf("%d\n",f[k][8][0]);
return 0;
}

bzoj 1974: [Sdoi2010]代码拍卖会的更多相关文章

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

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

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

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

  3. BZOJ 1974 [Sdoi2010] auction 代码拍卖会(数位dp)

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

  4. BZOJ 1974 [Sdoi2010]auction 代码拍卖会 ——动态规划

    把每一位上不递减的数拆成1+11+11111+11111+..... 然后就可以把巨大的N从复杂度中消掉,因为随着长度的增加1...111%p出现了循环节. 然后就是从n个数中选出几个使他们结果为0( ...

  5. [SDOI2010]代码拍卖会

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

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

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

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

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

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

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

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

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

随机推荐

  1. kali rolling更新源之gpg和dirmngr问题

    1.编辑 /etc/apt/source.list gedit /etc/apt/sources.list 输入更新源,可以选任何可用更新源,这里设置官方源 deb http://http.kali. ...

  2. mongo数据库的常见操作

    连接mongodb数据库的命令查看对应数据库mongo.exeuse shujukuming;db.opportunity.findOne({"id":5}); db.opport ...

  3. 将Python程序打包为exe方法

    将Python程序打包为exe文件,需要使用到的工具是pyinstaller pyinstaller是一个多平台的Python程序打包为exe的免费工具 安装pyinstaller: 1,在Windo ...

  4. 基于ssm的poi反射bean实例

    一:该例子是笔者在实际项目应用过程中,针对项目完成的一套基于poi的导入导出例子,其中一些与项目有关的代码大家直接替换成自己的需求即可. 二:笔者在项目中使用的是poi的XSSF,对应maven的po ...

  5. 《网络》:设置三个密码:通过console口连接设备,进入特权模式,登录Telnet

    软件:Cisco Packet Tracer Instructor 软件下载链接在上一篇文章中. 内容:通过设置三个密码,熟悉采用Telnet方式配置交换机的方法. 细节说明:计算机的IP地址和交换机 ...

  6. 新概念英语(1-139)Is that you, John?

    Lesson 139 Is that you, John? 是你吗,约翰? Listen to the tape then answer this question. Which John Smith ...

  7. Spark快速入门

    Spark 快速入门   本教程快速介绍了Spark的使用. 首先我们介绍了通过Spark 交互式shell调用API( Python或者scala代码),然后演示如何使用Java, Scala或者P ...

  8. jquery中attr与prop的区别

    先从一个老生常谈的问题说起,使用jquery实现全选全不选.楼主先使用的jquery版本是 jquery-1.11.1.min.js 全选<input type="checkbox&q ...

  9. Extensions in UWP Community Toolkit - SurfaceDialTextbox

    概述 UWP Community Toolkit Extensions 中有一个为TextBox 提供的 SurfaceDial 扩展 - SurfaceDialTextbox,本篇我们结合代码详细讲 ...

  10. Centos6.9minimal安装图形化界面

    有时我们会用到图形化界面来操作,下面介绍是在虚拟机上安装Centos6.9minimal版安装图形化界面(其他系统版本都类似吧,,,),如果是在物理机上安装进入的话要用的远程桌面工具VNC. VNC安 ...