SDOI2010 代码拍卖会

题意:

题目传送门

题解:

看完题目之后,第一反应应该就是数位\(Dp\)了,但是考虑到\(N\)非常的大,我们需要考虑另一种方法。注意到这个满足条件的数字的每一位都大于等于前一位,所以我们可以比较明显的发现,最后组成的数字一定可以表示成小于等于\(9\)个\(111...111\)(若干个\(1\))这样形式的数字之和,随后可以发现这些数字在模\(p\)的意义下是有循环节的,所以我们可以设计一个\(Dp\),记\(cnt[i]\)表示模\(p\)为\(i\)的\(111...111\)这样的数字的个数,\(f[i][j][k]\)表示考虑了模\(p\)小于等于\(i\)的数,当前数字模\(p\)为\(j\),已经选了\(k\)个\(111...111\)这样的数字的方案数,转移方程就是\(f[i][j][k] * \binom{cnt[i] + t - 1}{t} \to f[i + 1][(j + t \times i) \% p][k + t]\)。最后注意由于每一个数都是\(1\),所以\(1111...111\)(\(N\)个\(1\))是必选的。

Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 505;
const int Md = 999911659;
typedef long long ll;inline int Add(const int &x, const int &y) { return (x + y >= Md) ? (x + y - Md) : (x + y); }
inline int Sub(const int &x, const int &y) { return (x - y < 0) ? (x - y  + Md) : (x - y); }
inline int Mul(const int &x, const int &y) { return (ll)x * y % Md; }
int Powe(int x, int y) {int ans = 1;for(;y; y >>= 1, x = Mul(x, x)) if(y & 1) ans = Mul(ans, x);return ans;
}int f[N][N][10], cho[N][10], inv[10];
ll n;
ll cnt[N], st[N], num[N];
int p, sum, St, Ed;int main() {scanf("%lld%d", &n, &p);for(int i = 1; i <= n; i++) {sum = sum * 10 + 1; sum %= p;if(st[sum]) {St = st[sum]; Ed = i;break;}cnt[sum]++; st[sum] = i; num[i] = sum;}int len = 0;if(St) {len = Ed - St;ll c = n - Ed + 1;ll d = c / len, m = c % len;for(int i = St; i < Ed; i++) cnt[num[i]] += d;for(int i = St; i < Ed && m; i++, m--) cnt[num[i]] ++;}cnt[0]++;inv[1] = 1;for(int i = 2; i <= 9; i++) inv[i] = Mul(Md - Md / i, inv[Md % i]);for(int i = 0; i < p; i++) {cnt[i] %= Md;cho[i][0] = 1;for(int j = 1; j <= 8; j++) {cho[i][j] = Mul(Mul(cnt[i] % Md, cho[i][j - 1]), inv[j]);cnt[i] = Add(cnt[i], 1);  }}if(!len) {f[0][num[n]][0] = 1;for(int i = 0; i < p; i++) {for(int j = 0; j < p; j++) {for(int k = 0; k <= 8; k++) {for(int t = 0; t <= k; t++) {if(!f[i][(j - t * i % p + p) % p][k - t]) continue; f[i + 1][j][k] = Add(f[i + 1][j][k], Mul(f[i][(j - t * i % p + p) % p][k - t], cho[i][t]));}}}}printf("%d\n", f[p][0][8]);return 0;}int las = (n - Ed + 1) % len;if(!las) las += len;f[0][num[St + las - 1]][0] = 1;for(int i = 0; i < p; i++) {for(int j = 0; j < p; j++) {for(int k = 0; k <= 8; k++) {for(int t = 0; t <= k; t++) {if(!f[i][(j - t * i % p + p) % p][k - t]) continue; f[i + 1][j][k] = Add(f[i + 1][j][k], Mul(f[i][(j - t * i % p + p) % p][k - t], cho[i][t]));}}}}printf("%d\n", f[p][0][8]);return 0;
}

转载于:https://www.cnblogs.com/Apocrypha/p/10639135.html

SDOI2010 代码拍卖会相关推荐

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

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

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

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

  3. bzoj1974 [Sdoi2010]代码拍卖会 循环+背包

    一般这种计数题就两个套路:找到倍数然后删除不合法的   找到合法的然后删除不是倍数的 如果先找倍数,那不合法的数位置和倍数没有直接关系 这个题是要先找合法的 然后删除不是倍数的 首先这个合法的数找的方 ...

  4. BZOJ 1974 [Sdoi2010]auction 代码拍卖会 | 51nod 1261 上升数

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1974 http://www.51nod.com/onlineJudge/questionCo ...

  5. [BZOJ1974][Sdoi2010]auction 代码拍卖会(dp+组合数学)

    Address https://www.lydsy.com/JudgeOnline/problem.php?id=1974 Solution 看上去是一个显然的数位 dp ,但是看到 N≤1018N≤ ...

  6. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  7. 杂题记录及简要题解(一)

    一些前几天做过的还不错的但是不是太想专门花一整篇博客的篇幅去写的题就简要地记录在这里. 说是简要题解,其实写得还是挺详细的.之后的杂题记录可能就会写得简略一点. CF1060E Sergey and ...

  8. 隐私合规:收集SDK部分介绍

    com.meizu.cloud.pushsdk.SystemReceiver 魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族 push SDK 的客户端实时地推送通知或者消 ...

  9. BZOJ 1923: [Sdoi2010]外星千足虫

    1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 921  Solved: 592 [Submit][Stat ...

最新文章

  1. Vision 圖像識別框架的使用
  2. Scrapy框架CrawlSpider类爬虫实例
  3. 怎么用python处理excel文件-python处理Excel文件
  4. 2016rMBP登录后自动关机、帐户数据丢失
  5. 操作系统 真象还原 读书笔记
  6. 谷歌 recaptcha_在Spring Boot应用程序中使用Google reCaptcha
  7. ls mac 显示最近修改日期_Find Any File for Mac(Mac本地文件搜索工具)
  8. sprintf用法详解
  9. 只腐蚀毛刺 腐蚀算法_去毛刺工艺大全,一次性列举了14种方法,非常全面
  10. ArcGis CityEngine 下载地址
  11. 2022年新出的Python学习神器,强烈推荐
  12. php数组的作业,PHP数组
  13. 快递单号物流查询自动识别接口【快递鸟API通用教程】
  14. 教你几个手机识别图片中的文字小技巧
  15. 熔断机制什么意思_什么是熔断机制,熔断机制是什么意思
  16. Python3 迁移怨声载道
  17. javax.el.PropertyNotFoundException: Property 'eid' not found on type com.aqd.entity.User
  18. oracle dba 创建视图,拥有dba权限的情况下创建视图报ORA-01031: insufficient privileg错误...
  19. 自学 R 语言的十条干货技巧分享
  20. 常见数据库优化面试题

热门文章

  1. 数控机床手动编程能否用计算机验证,数控编程的方法有几种_数控编程的步骤...
  2. 1032. 挖掘机技术哪家强(20)-PAT乙级真题
  3. python colorbar位置大小调整_python - matplotlib相邻子图:添加colorbar更改子图的大小 - 堆栈内存溢出...
  4. A10负载均衡设备基础配置
  5. linux 中用vi编辑器替换字符
  6. Jenkins服务器磁盘空间爆满问题解决
  7. paper 134:结构张量structure tensor(二)
  8. 【Maven】Maven下载源码和Javadoc的方法
  9. javascript版购物网站图片轮转
  10. 中国移动总经理易人对产业格局的影响