Luogu2481 SDOI2010 代码拍卖会 DP、组合
神仙DP
注意到\(N \leq 10^{18}\),不能够直接数位DP,于是考虑形成的\(N\)位数的性质。
因为低位一定不会比高位小,所以所有满足条件的\(N\)位数一定是不超过\(9\)个\(f(x)(x \in [1,N])\)的和,其中\(f(x) = \sum\limits_{i=0}^{x-1} 10^i\),且其中一定有一个\(f(N)\)。
考虑由\(f(x)\ \bmod\ P\)形成的数列,因为\(f(x) = 10f(x-1) + 1\),所以这个数列一定会存在一个不超过\(P\)的循环节。那么我们可以通过这个预处理出\(cnt_i = \sum\limits_{x=1}^N[f(x) \mod P = i]\),同时求出\(f(N)\ \bmod\ P\)的值。
接下来就可以DP了:设\(f_{i,j,k}\)表示考虑了\(cnt_0 \sim cnt_{i-1}\),选择了\(k\)个\(f(x)\),它们的和\(\bmod\ P = j\)的方案数。转移考虑枚举\(cnt_i\)中选择多少个,这就是一个插板法,转移系数是一个组合数。
最后的答案就是\(\sum\limits_{i=0}^8 f_{P,(P - f(N))\ \bmod P,i}\),\(i\)最大为\(8\)的原因是必须要选择一个\(f(N)\)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 999911659;
int dp[503][503][9] , Cnt[503] , dir[503] , N , P;
int poww(int a , int b){
int times = 1;
while(b){
if(b & 1) times = times * a % MOD;
a = a * a % MOD; b >>= 1;
}
return times;
}
int binom(int a , int b){
int times = 1;
for(int i = a ; i > a - b ; --i)
times = times * i % MOD * poww(a - i + 1 , MOD - 2) % MOD;
return times;
}
signed main(){
cin >> N >> P;
int cur = 1 % P , cnt = 1 , tmp = 1 % P , ed;
do{dir[cur] = cnt; ++cnt; cur = (cur * 10 + 1) % P;}while(!dir[cur]);
for(int i = 1 ; i < dir[cur] && i <= N ; ++i , tmp = (tmp * 10 + 1) % P) ++Cnt[ed = tmp];
if(dir[cur] <= N){
for(int i = dir[cur] ; i < cnt ; ++i , tmp = (tmp * 10 + 1) % P) Cnt[ed = tmp] = (N - dir[cur] + 1) / (cnt - dir[cur]) % MOD;
for(int i = 1 ; i <= (N - dir[cur] + 1) % (cnt - dir[cur]) ; ++i , tmp = (tmp * 10 + 1) % P) ++Cnt[ed = tmp];
}
dp[0][0][0] = 1;
for(int i = 0 ; i < P ; ++i)
for(int j = 0 ; j <= 8 ; ++j){
int val = binom(Cnt[i] + j - 1 , j);
if(!val) continue;
for(int k = 0 ; k < P ; ++k)
for(int l = 0 ; l + j <= 8 ; ++l)
dp[i + 1][(k + i * j) % P][l + j] = (dp[i + 1][(k + i * j) % P][l + j] + val * dp[i][k][l]) % MOD;
}
int sum = 0;
for(int i = 0 ; i <= 8 ; ++i)
sum = (sum + dp[P][(P - ed) % P][i]) % MOD;
cout << sum;
return 0;
}
Luogu2481 SDOI2010 代码拍卖会 DP、组合的更多相关文章
- [SDOI2010]代码拍卖会——DP
原题戳这里 绝对是一道好题 需要注意到两个东西 1.符合条件的数可以拆成一堆\(11...11\)相加的形式,比如\(1145=1111+11+11+11+1\) 2.\(1,11,111,1111, ...
- SDOI2010代码拍卖会 (计数类DP)
P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...
- 【BZOJ-1974】auction代码拍卖会 DP + 排列组合
1974: [Sdoi2010]auction 代码拍卖会 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 305 Solved: 122[Submit ...
- BZOJ 1974: [Sdoi2010]auction 代码拍卖会( dp )
在1, 11, 111……中选<=8个, + 11..(n个1)拼出所有可能...这些数mod p至多有p中可能, 找出循环的处理一下. 那么dp就很显然了...dp(i, j, k)表示前i种 ...
- [SDOI2010]代码拍卖会
题目描述 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关 ...
- bzoj 1974: [Sdoi2010]代码拍卖会
Description 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代 码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPi g不想把代码库给所有想要的小猪,只想 ...
- 洛谷 P2481 [SDOI2010]代码拍卖会
洛谷 这大概是我真正意义上的第一道黑题吧! 自己想出了一个大概,状态转移方程打错了一点点,最后还是得看题解. 一句话题意:求出有多少个\(n\)位的数,满足各个位置上的数字从左到右不下降,且被\(p\ ...
- [BZOJ1974][SDOI2010]代码拍卖会[插板法]
题意 询问有多少个数位为 \(n\) 的形如 \(11223333444589\) 的数位值不下降的数字在\(\mod p\) 的意义下同余 \(0\). $n\leq 10^{18} ,p\leq ...
- luogu P2481 [SDOI2010]代码拍卖会
luogu 题目中的那个大数一定是若干个1+若干个2+若干个3...+若干个9组成的,显然可以转化成9个\(\underbrace {111...1}_{a_i个1}(0\le a_1\le a_2\ ...
随机推荐
- 使用charles对jmeter进行抓包
- UltraISO 下载
链接:https://pan.baidu.com/s/1Wf0TmB8L9falKyGu8NwvBw 提取码:1cu8 参考: https://jingyan.baidu.com/article/cb ...
- kali linux 局域网攻击(一)
一.攻击准备 此为局域网攻击测试 1)查看自己的IP地址,记住默认网关 2)扫描局域网中的IP fping -asg nbtscan -r 网关地址/ 3)使用arpspoof进行断网攻击 攻击前, ...
- nagios监控的安装
本文中,物理机IP 192.168.1.105虚拟linux主机ip 192.168.1.10安装apache和phpApache 和Php 不是安装nagios 所必须的,但是nagios提供了we ...
- web: 屏蔽button元素的空格键和enter响应
用tab键可以在各种元素之间切换焦点,然后键盘上的空格和enter按键触发click事件,我这里不想要这种效果. 所以我需要屏蔽这两个按键. function keyup(e) { var currK ...
- window.showModelessDialog传值
参数传递:1. 要想对话框传递参数,是通过vArguments来进行传递的.类型不限制,对于字符串类型,最大为4096个字符.也可以传递对象,例如:------------------------ ...
- How to Use Convolutional Neural Networks for Time Series Classification
How to Use Convolutional Neural Networks for Time Series Classification 2019-10-08 12:09:35 This blo ...
- spring.factories spring.schemas spring.handlers spring自动装配
org.springframework.core.io.support.SpringFactoriesLoader —— public static final String FACTORIES_RE ...
- Sword 位运算取余操作
/* 位运算取余操作 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...
- Qt编写数据可视化大屏界面电子看板系统
一.前言 目前大屏大数据可视化UI这块非常火,趁热也用Qt来实现一个,Qt这个一站式超大型GUI超市,没有什么他做不了的,大屏电子看板当然也不在话下,有了QSS和QPainter这两个无敌的工具组合, ...