原题戳这里

绝对是一道好题

需要注意到两个东西

**

1.符合条件的数可以拆成一堆\(11...11\)相加的形式,比如\(1145=1111+11+11+11+1\)

2.\(1,11,111,1111,...\)模\(p\)会出现循环,循环节长度不超过\(p\)

**

还有就是\(11...11\)最多为\(9\)个,然后就可以\(dp\)了

首先需要统计长度为\(1-n\)的全\(1\)串中有多少个模\(p\)为\(r\),记为\(cnt[r]\),这个可以\(O(p)\)的预处理出来

接着设\(f[k][i][j]\)表示在\(cnt[1]-cnt[i]\)中已经选了\(k\)个,且它们的和模\(p\)为\(j\)的方案数,那么转移如下:

\[f[k+l][i][(j+l\times i)\% p]+=\binom{cnt[i]+l-1}{l}f[k][i-1][j],0\leqslant k+l\leqslant 8
\]

为什么是\(8\)而不是\(9\)呢?因为我们至少要选一个长度为\(n\)的全\(1\)串,为了方便,我们在\(dp\)之前就把它选出来,相当于占用了\(9\)个中的\(1\)个

还有就是那个组合是可重组合

细节看代码吧:

#include <bits/stdc++.h>

using namespace std;

#define $SHOW(x) cout << #x" = " << x << endl

#define ll long long
#define MOD 999911659
#define MAXN 500 ll n, P, all, cnt[MAXN + 5], inv[10]; // all代表长度为n的全1串模p的值
int st, len, pos[MAXN + 5], f[10][MAXN + 5][MAXN + 5]; void add(int &x, int y) {
x = (x + y) % MOD;
if(x < 0) x += MOD;
} int Mul(int x, int y) {
return 1LL * x * y % MOD;
} int fpow(int x, int p) {
int ret = 1;
while (p) {
if (p & 1) ret = Mul(ret, x);
x = Mul(x, x);
p >>= 1;
}
return ret;
} int C(ll n, ll m) {
if (n < m) return 0;
int ret = 1;
for (ll x = n, y = 1; y <= m; --x, ++y)
ret = Mul(ret, Mul(x % MOD, inv[y]));
return ret;
} int main() {
cin >> n >> P;
if (n <= P) { // 预处理循环节
int sum = 0;
for (int i = 1; i <= n; ++i) {
sum = (sum * 10 + 1) % P;
cnt[sum]++;
}
all = sum;
}
else {
int sum = 0;
for (int i = 1; i <= P + 1; ++i) {
sum = (sum * 10 + 1) % P;
if (cnt[sum]) {
st = pos[sum], len = i - pos[sum];
break;
}
pos[sum] = i, cnt[sum]++;
}
for (int i = 0; i < P; ++i)
if (cnt[i] && pos[i] >= st) {
cnt[i] = (n - st + 1) / len;
if (pos[i] - st + 1 <= (n - st + 1) % len) cnt[i]++;
if ((pos[i] - st + 1) % len == (n - st + 1) % len) all = i;
}
}
for (int i = 1; i <= 8; ++i) inv[i] = fpow(i, MOD - 2);
f[0][0][all] = 1; // 初始化
for (int r = 0; r < P; ++r) {
for (int i = 0; i <= 8; ++i)
for (int k = 0; k < P; ++k)
for (int j = 0; j + i <= 8; ++j)
if(cnt[r]) add(f[i + j][r + 1][(k + j * r % P) % P], Mul(C(cnt[r] + j - 1, j), f[i][r][k]));
else f[i][r + 1][k] = f[i][r][k]; // 注意这里,要把值继承过来
}
int ans = 0;
for (int i = 0; i <= 8; ++i)
add(ans, f[i][P][0]);
printf("%d\n", ans);
return 0;
}

[SDOI2010]代码拍卖会——DP的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ-1974】auction代码拍卖会 DP + 排列组合

    1974: [Sdoi2010]auction 代码拍卖会 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 305  Solved: 122[Submit ...

  5. [SDOI2010]代码拍卖会

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

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

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

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

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

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

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

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

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

随机推荐

  1. HBuilder git使用教程

    1.插件安装 打开HBuilder,工具->插件安装. 等待安装,成功后提示重启后生效,立即重启. 2.在码云上新建一个项目,复制项目地址. 码云地址:https://gitee.com/ 3. ...

  2. web项目获取资源文件

    首页 博客 学院 CSDN学院 下载 论坛 APP CSDN 问答 商城 活动 VIP会员 专题 招聘 ITeye GitChat GitChat 图文课 写博客 消息 1 评论 关注 点赞 回答 系 ...

  3. Kubernetes---Pod hook

    Pod hook(钩子)是由Kubernetes管理的kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中.可以同时为Pod中的所有容器都配置 hook ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 I. query 树状数组

    I. query 题目链接: Problem Description Given a permutation \(p\) of length \(n\), you are asked to answe ...

  5. python3启航

    Python3的基本数据类型 数字 int ,所有功能都放在int里 a1 = 123 a2 = 456 ##int 将字符串转换为数字 a = "123" print(tyep( ...

  6. mysql 登录修改密码与数据库备份

    1.mysql首次登录修改密码 mysql -uroot -p(首次登录无密码,按回车即可:如果无法登陆,修改mysql配置文件,在[mysqld]最后一行加skip-grant-tables即可登录 ...

  7. xtrabackup原理,整库,单表,部分备份恢复

    物理备份xtrabackup原理 Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle).Pe ...

  8. k8s之资源指标API部署metrics-server

    1.部署metrics-server 从v1.8开始,引入了新的功能,即把资源指标引入api,资源指标:metrics-server,自定义指标:prometheus,k8s-prometheus-a ...

  9. Spring实战(五)Spring中条件化地创建bean

    1.@Conditional 为生成bean设置条件 Spring 4中引入了一个新的注解---@Conditional,它用在有@Bean的方法上. 如果给定条件计算结果为true,Spring会创 ...

  10. js 替换html

    function getInfo(){ var player_name=$("#name").val(); $.ajax({ url: 'get_wefare', method: ...